为什么直接在函数上添加方法不能像function.prototype那样工作?

时间:2016-06-29 11:27:53

标签: javascript prototype javascript-objects

我正在学习并尝试深入理解JavaScript对象。我通过以下示例了解了Object prototype

var MyObj = function(){
   this.Name = "Stackoverflow";
}

MyObj.prototype.prop = "OK"; 

var instance = new MyObj();
instance.prop = "OK";

console.log(instance.hasOwnProperty("Name")); //true
console.log(Object.getOwnPropertyNames(instance)); //[ 'Name', 'prop' ]

在上面的示例中,instance对象无法访问getOwnPropertyNames的{​​{1}}。因为Object函数不是getOwnPropertyNames原型的成员。在此之后,当我像Object上面写我自己的对象时,例如

Object

如何在此示例中使var MyDream = function(){} MyDream.prototype.canAccessThisMethod = function(x){}; var instanceSample = new MyDream(); instanceSample.canAccessThisMethod("blabla"); //because of prototype MyDream.method(blabla); // didn't work. 正常工作?

2 个答案:

答案 0 :(得分:1)

您可以这样做,例如:

instanceSample.prototype.method = function( x ){
...
}

原型意味着方法"方法"将添加到班级的所有对象" MyDream"

答案 1 :(得分:1)

除了解释prototypes之外,让我们关注你在以下片段中提出的问题,即

var MyDream = function(){}
MyDream.prototype.canAccessThisMethod = function(x){ };

var instanceSample = new MyDream();

instanceSample.canAccessThisMethod("blabla"); //because of prototype
MyDream.method(blabla); //How can we write "MyDream.method" in this example

让我们一步一步走。

var MyDream = function(){}

您创建了一个匿名函数并将其分配给MyDream变量。 Functions are first class objects in JavaScript。它们功能强大且灵活。因此,作为第一类对象,您可以将它们分配给您所做的变量。您可以将它们作为参数传递。最重要的是,您还可以将原型链扩展为

MyDream.prototype.canAccessThisMethod = function(x){ };

我相信你已经找到了剩下的东西,所以跳过细节,快速转向这个陈述。

MyDream.method(blabla);

不幸的是,这不起作用。原因是,要添加function as method,您需要将其指定为函数文字。您可以像Objects一样添加方法。

MyDream.method = function(x) {
    console.log(x);
}

MyDream.method("bla bla");