我通过__proto__
属性了解javascript原型继承。但是我注意到,当我var f = function() {}
时,f除prototype
属性外还会有__proto__
属性。 prototype
似乎没有参与财产链接。 究竟做了什么?
答案 0 :(得分:4)
它被指定为通过new
关键字使用该功能创建的对象的原型。
例如:
function Foo() {
}
Foo.prototype.bar = 47;
var obj = new Foo();
alert(obj.bar); // alerts 47, via `obj`'s prototype
obj
与分配给Foo.prototype
的对象之间的引用属于实时引用,因此向Foo.prototype
添加更多内容会使它们显示在obj
上原型:
Foo.prototype.charlie = 62;
alert(obj.charlie); // alerts 62
当然,如果您替换 Foo.prototype
(我不鼓励),那么您将Foo.prototype
指向另一个对象。 obj
仍然会引用旧的:
Foo.prototype = {delta: 77}; // Not recommended
alert(obj.delta); // alerts "undefined"
关于__proto__
:__proto__
是非标准的。在ECMAScript5之前(只有一年半),有没有标准方式直接与对象的原型交互,你只能在对象创建时分配它们,并且仅通过构造函数的prototype
属性间接进行。 __proto__
是一些JavaScript引擎的专有扩展(最着名的是Mozilla的SpiderMonkey,Firefox中的引擎)。它没有任何标准,根据ECMAScript委员会的说法,它不会。 (相反,ECMAScript5提供了函数,用于与对象的原型进行交互。)__proto__
is now deprecated由Mozilla提供。
答案 1 :(得分:4)
_proto_
属性是对象的实例的属性(对象在这种情况下是一个函数),它指的是实例的原型。您应该注意,此属性是非标准和折旧的,请改为使用Object.getPrototypeOf(ref)
:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Proto
prototype
是函数声明(不是实例)的属性,并且是函数的所有实例的原型。查看文档:{{3}}
当您创建函数的新实例(使用new
关键字)时,将创建一个函数对象,由prototype
定义。在实例化(var myNewObject = new Foo()
)之后,对Object.getPrototypeOf(myNewObject)
的调用将返回对实例所基于的原型的引用。
总结一下:__proto__
是什么东西,prototype
是什么东西可以(或可能已经是)。