JS原型继承自定义类

时间:2015-10-11 09:21:28

标签: javascript

有两个构造函数:Animal和Rabbit(类仿真)。如何正确使用原型为这些类设置继承?我看过2个版本:

Rabbit.prototype.__proto__ = Animal.prototype;

我认为它符合我的预期。但是这个版本在IE10中不起作用,并且有以下版本:

Rabbit.prototype = Object.create(Animal.prototype);

这个版本看起来也不错,但我必须为它创建一个额外的对象。哪个版本更受欢迎?可能还有别的吗?提前致谢。

3 个答案:

答案 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的对象。

在实践中,差异是:

  • 修改[[Prototype]]被许多人认为是不好的做法,并且表现不佳。
  • 用不同的对象替换整个原型只会影响之后创建的实例。以前的实例仍将继承之前的Rabbit.prototype
  • 如果用不同的对象替换整个原型,则应考虑复制旧的原型(和符号)。例如,constructor属性。