给出以下构造函数,
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;
因为它们似乎具有相同的效果。
答案 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
,则已存在的实例将具有旧原型,新实例将获得新实例。但这是一个侧点。)