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中文网其他相关文章!