有两个构造函数:Animal和Rabbit(类仿真)。如何正确使用原型为这些类设置继承?我看过2个版本:
Rabbit.prototype.__proto__ = Animal.prototype;
我认为它符合我的预期。但是这个版本在IE10中不起作用,并且有以下版本:
Rabbit.prototype = Object.create(Animal.prototype);
这个版本看起来也不错,但我必须为它创建一个额外的对象。哪个版本更受欢迎?可能还有别的吗?提前致谢。
答案 0 :(得分:0)
首选版本Rabbit.prototype = Object.create(Animal.prototype);
。
Mozilla开发者网络(MDN)对__proto__
:
警告:根据现代JavaScript引擎如何在每个浏览器和JavaScript引擎中优化属性访问,非常慢的操作,改变对象的[[Prototype]]。对改变继承的性能的影响是微妙和遥远的,并不仅仅局限于在obj。 proto = ...语句中花费的时间,但可以扩展到任何有权访问的代码。任何[[原型]]被改变的物体。如果您关心性能,则应避免设置对象的[[Prototype]]。而是使用Object.create()创建一个具有所需[[Prototype]]的新对象。
答案 1 :(得分:0)
你应该有这样的东西:
Rabbit.prototype = Object.create(Animal.prototype);
Rabbit.prototype.constructor = Rabbit;
如果你不写第二行Rabbit
的实例将有Animal
构造函数。
也可以这样做:
Rabbit.prototype = new Animal();
但在这种情况下,您还将触发构造函数,这不是首选。
答案 2 :(得分:0)
每个对象都有一个内部[[Prototype]]属性,其值是前者从中继承的对象。
然后Rabbit.prototype.__proto__ = Animal.prototype
更改Rabbit.prototype
的[[原型]],使其继承自Animal.prototype
。
相反,Rabbit.prototype = Object.create(Animal.prototype)
会将整个Rabbit.prototype
替换为另一个继承自Animal.prototype
的对象。
在实践中,差异是:
Rabbit.prototype
。constructor
属性。