__proto__
我通过属性了解javascript原型继承。但是我注意到,当我这样做时,var f = function() {}
f 现在prototype
除了属性之外还有一个__proto__
属性。似乎prototype
不参与属性链接。它究竟是做什么的?
2 回答
它被指定为通过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__
现在被 Mozilla 弃用。
_proto_
属性是对象实例的属性(在这种情况下,对象是函数),它指的是实例的原型。您应该注意,此属性是非标准且已折旧,请Object.getPrototypeOf(ref)
改用:https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Proto
prototype
相反,它是函数声明(不是实例)的属性,并且是函数所有实例的原型。查看文档:https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/prototype
当您创建函数的新实例(使用new
关键字)时,会创建一个函数对象,如prototype
. 在它被实例化 ( var myNewObject = new Foo()
) 之后,调用Object.getPrototypeOf(myNewObject)
将返回对实例所基于的原型的引用。
总而言之:__proto__
是什么是什么,prototype
是什么可以(或可能已经是)。