首页 > web前端 > js教程 > 什么时候应该在 JavaScript 继承中避免 `Child.prototype = Parent.Prototype`?

什么时候应该在 JavaScript 继承中避免 `Child.prototype = Parent.Prototype`?

Patricia Arquette
发布: 2024-11-14 10:28:02
原创
456 人浏览过

When Should You Avoid `Child.prototype = Parent.Prototype` in JavaScript Inheritance?

何时在 JavaScript 继承中避免 Child.prototype = Parent.Prototype

虽然在 JavaScript 中使用 Child.prototype = 继承是常见的做法new Parent();,在某些情况下 Child.prototype = Parent.Prototype 可能会导致意外行为。

考虑以下代码片段:

function GameObject(oImg, x, y) {

    this.x = x;
    this.y = y;
    this.img = oImg;

    this.hit = new Object();
    this.hitBox.x = x;
    this.hitBox.y = y;
    this.hitBox.width = oImg.width;
    this.hitBox.height = oImg.height;

}

Spaceship.prototype = new GameObject();
Spaceship.prototype.constructor = Spaceship;

function Spaceship(){
    console.log("instantiate ship");
    GameObject.apply(this, arguments);
    this.vx = 0;
    this.vy = 0;
    this.speed = 3;
    this.friction = 0.94;
}
登录后复制

在检查 Spaceship 构造函数时,您会发现你会注意到它的 __proto__ 属性指向 Spaceship,而不是 GameObject。这是因为以下行:

this.hitBox.width = oImg.width;
this.hitBox.height = oImg.height;
登录后复制

直接将属性分配给 this.hitBox,而 GameObject 原型中不存在该属性。这种行为是有问题的,因为它:

  • 破坏继承:当使用 Child.prototype = Parent.Prototype 时,Child 原型不会继承添加到 Parent 原型的任何新函数。
  • 违反了instanceof检查:由于Spaceship实例的__proto__指向Spaceship而不是GameObject,检查if(object instanceof GameObject)将会失败。

为什么使用Child.prototype = new Parent() ;相反

Child.prototype = new Parent();调用 Parent 类的构造函数并将其新创建的实例分配给 Child 原型。这可以确保:

  • 保留继承:添加到父级原型的任何新函数都将自动由子级继承。
  • instanceof 检查是准确的:子级实例的 __proto__指向Parent原型,允许正确的instanceof检查。

替代解决方案

在支持Object.create的现代浏览器中,您可以使用Spaceship.prototype = Object.create(GameObject.prototype);创建子原型。这在功能上等同于 Child.prototype = new Parent();但更简洁,避免了不必要的构造函数调用。

以上是什么时候应该在 JavaScript 继承中避免 `Child.prototype = Parent.Prototype`?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板