快速Javascript继承:理解__proto__

时间:2011-06-03 09:56:04

标签: javascript inheritance prototype-programming

给出以下构造函数,

Dog = function(name, age, ...){
    Animal.call(this, name, age, ...);
    // And some other stuff that dogs do
}

我使用以下代码行从Animal类复制我的方法和属性,

Dog.prototype = new Animal();

你能否告诉我这与

有何不同
Dog.prototype.__proto__ = Animal.prototype;

因为它们似乎具有相同的效果。

2 个答案:

答案 0 :(得分:5)

__proto__可让您访问对象的内部[[Prototype]]属性。它可用于获取或设置已经 现有对象的原型。

protoype是一个函数的属性,用于设置对象的原型,将通过该函数创建。

Afaik,只有Firefox允许您使用__proto__It is not standard and deprecated


值得一读:

答案 1 :(得分:4)

__proto__是JavaScript的非标准扩展(在各种解释器中很常见,但非标准),可让您直接访问对象后面的原型。函数对象的prototype属性是指定为通过new调用函数创建的对象后面的原型的对象。因此,当您分配给prototype.__proto__时,您将分配对象后面的原型,该对象将被设置为函数创建的新对象的原型。

由于原型链的工作方式是原型上的属性显示为对象的继承属性(并且这在链中继续),如果分配给Dog.prototype.__proto__,则由{{1创建的对象将通过链间接访问这些属性:

+-----------------+      +----------------+      +-------------------------+
| instance of Dog |----->| Dog.prototype  |----->| Dog.prototype.__proto__ |
|                 |      |                |      | `foo` property          |
|                 |      |                |      | `bar` property          |
+-----------------+      +----------------+      +-------------------------+

直接分配给Dog时,实例会有更直接的引用:

+-----------------+      +----------------+
| instance of Dog |----->| Dog.prototype  |
|                 |      | `foo` property |
|                 |      | `bar` property |
+-----------------+      +----------------+

(请注意,上面的内容是稍微误导,引用Dog.prototype就是这样。Dog.prototype的实例会直接引用Dog上的对象截至调用Dog.prototype时;如果稍后将一个完全不同的对象分配给new Dog,则已存在的实例将具有旧原型,新实例将获得新实例。但这是一个侧点。)