JS函数的原型属性用于什么?

时间:2011-06-06 18:21:12

标签: javascript prototypal-inheritance

我通过__proto__属性了解javascript原型继承。但是我注意到,当我var f = function() {}时,f除prototype属性外还会有__proto__属性。 prototype似乎没有参与财产链接。 究竟做了什么?

2 个答案:

答案 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"

Gratuitous live example

关于__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是什么东西可以(或可能已经是)。