2

__proto__我通过属性了解javascript原型继承。但是我注意到,当我这样做时,var f = function() {}f 现在prototype除了属性之外还有一个__proto__属性。似乎prototype不参与属性链接。它究竟是做什么的?

4

2 回答 2

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__现在被 Mozilla 弃用。

于 2011-06-06T18:22:58.527 回答
4

_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是什么可以(或可能已经是)。

于 2011-06-06T18:26:38.133 回答