首页 >web前端 >js教程 >JavaScript 继承:Child.prototype = Parent.Prototype 与 Child.prototype = new Parent() - 哪种方法更好?

JavaScript 继承:Child.prototype = Parent.Prototype 与 Child.prototype = new Parent() - 哪种方法更好?

Barbara Streisand
Barbara Streisand原创
2024-11-17 15:46:01348浏览

JavaScript Inheritance: Child.prototype = Parent.Prototype vs. Child.prototype = new Parent() - Which Approach is Better?

Javascript 继承的细微差别:Child.prototype = Parent.Prototype 与 Child.prototype = new Parent()

在 Javascript 中,继承通常使用原型机制来实现。这两种常见方法之间的关键区别在于它们对子对象的 proto 属性的影响。

当使用 Child.prototype = Parent.Prototype 时,子原型和父原型都指向同一个对象。这意味着对子级原型所做的任何更改也会影响父级原型。

但是,当使用 Child.prototype = new Parent() 时,会创建一个继承自父级原型的新对象。这可确保子级原型与父级原型隔离,从而允许独立修改而不影响父级。

对实例属性的影响

在提供的示例中,问题在子构造函数中设置实例属性时会出现:

this.hitBox.width = oImg.width;
this.hitBox.height = oImg.height;

使用 Child.prototype = Parent.Prototype,这些属性将直接添加到子级的原型中,该原型也是父级的原型。结果,子构造函数中的 console.log(this) 显示 proto: Spaceship 因为原型现在设置为 Spaceship。

解决方案:使用 Object.create

为了避免这个问题,建议使用 Object.create(Parent.prototype):

Spaceship.prototype = Object.create(GameObject.prototype);

此策略创建一个继承自父级原型的新对象,同时保持自己独立的原型。添加到子级原型的实例属性不会影响父级原型。

与instanceof的比较

在使用对象instanceof GameObject检查继承的情况下,重要的是请注意,Child.prototype = Parent.Prototype 将无法通过此测试,因为子级的原型不是 GameObject 的实例。相比之下,Child.prototype = new Parent() 将按预期通过测试。

推荐

对于 Javascript 中健壮且隔离的继承,通常首选使用 Child.prototype = Object.create(Parent.prototype) 而不是 Child.prototype = Parent.Prototype.

以上是JavaScript 继承:Child.prototype = Parent.Prototype 与 Child.prototype = new Parent() - 哪种方法更好?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn