首先,我们知道函数只不过是对象,因为我们可以为其附加属性。这就是案例 1 中所发生的情况。
我们只是简单地将一个属性附加到一个function Foo
Case 1
var Foo = function(){
this.name = "myname";
}
Foo.newProp = function(){};
附加到函数的属性可以像访问对象的属性一样简单地访问。
Case 2
在这种情况下,同一财产位于prototype
该功能的。当使用 this 创建任何对象时function Foo
,默认情况下会访问此功能。
当使用该对象调用函数时,上下文this
将知道调用该函数的对象并且this
指向调用它的对象。
Foo.prototype.newProp = function(){ console.log("function on prototype");}
var value = new Foo();
console.log(value);
同样在情况 2 中,由于我们将属性添加到函数的原型中,因此它们并不位于使用该函数创建的对象上,而是位于该对象的原型上。检查如下所示的屏幕截图:
这意味着访问该属性的每个对象都将指向一个公共内存位置,因此它也是内存高效的。
您始终可以继续修改该属性,方法是直接在对象上将其定义为:
value.newProp = function(){ console.log("modified property") };
现在,如果您调用此函数,它将直接在对象上找到它,并且不会沿着原型链从公共内存位置(即对象的原型)访问它function Foo