Javascript 自定义类的JS原型继承

Javascript 自定义类的JS原型继承,javascript,Javascript,有两个构造函数:Animal和Rabbit(类仿真)。如何正确使用原型设置此类的继承?我看过两个版本: Rabbit.prototype.__proto__ = Animal.prototype; 我认为它的效果和我预期的一样好。但此版本在IE10-中不起作用,有以下版本: Rabbit.prototype = Object.create(Animal.prototype); 这个版本看起来也不错,但我必须为它创建一个附加对象。首选哪个版本?可能还有别的事吗?提前谢谢 版本Rabbit.pr

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

Rabbit.prototype.__proto__ = Animal.prototype;
我认为它的效果和我预期的一样好。但此版本在IE10-中不起作用,有以下版本:

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

这个版本看起来也不错,但我必须为它创建一个附加对象。首选哪个版本?可能还有别的事吗?提前谢谢

版本
Rabbit.prototype=Object.create(Animal.prototype)

Mozilla开发者网络(MDN)对
\uuuu proto\uuu
发出以下警告:

警告:根据现代JavaScript引擎优化属性访问的本质,更改对象的[[Prototype]]在每个浏览器和JavaScript引擎中都是一个非常缓慢的操作。改变遗传对性能的影响是微妙而深远的,不仅限于花在obj上的时间。proto=。。。语句,但可以扩展到可以访问其[[Prototype]]已更改的任何对象的任何代码。如果您关心性能,则应避免设置对象的[[Prototype]]。相反,使用object.create()创建具有所需[[Prototype]]的新对象


你应该有这样的东西:

Rabbit.prototype = Object.create(Animal.prototype);
Rabbit.prototype.constructor = Rabbit;
如果不编写第二行,则
Rabbit
的实例将具有
Animal
构造函数

此外,还可以执行以下操作:

Rabbit.prototype = new Animal();

但在这种情况下,您还将触发构造函数,这不是首选。每个对象都有一个内部[[Prototype]]属性,其值是前者从中继承的对象

然后
Rabbit.prototype.\uuu-proto\uuu=Animal.prototype
更改
Rabbit.prototype
的[[prototype]],使其继承自
Animal.prototype

相反,
Rabbit.prototype=Object.create(Animal.prototype)
将整个
Rabbit.prototype
替换为另一个对象,该对象继承自
Animal.prototype

在实践中,区别在于:

  • 修改[[Prototype]]被很多人认为是一种不好的做法,而且性能很差
  • 用不同的对象替换整个原型只会影响在此之后创建的实例。以前的实例仍将继承以前的
    Rabbit.prototype
  • 如果你用一个不同的对象替换整个原型,你应该考虑复制旧的一个属性(和符号)。例如,
    构造函数
    属性