一尘不染

为什么我不使用Child.prototype = Parent.Prototype而不是Child.prototype = new Parent();Java继承?

javascript

我不理解javascript中的这种行为来继承,我一直都这样定义它:

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;
}

但就我而言,这些行:

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

当我在Spaceship构造函数中执行console.log(this)时,可以看到 proto
属性设置为Spaceship而不是GameObject,如果删除它们,则将其设置为GameObject。

如果我使用:

 Spaceship.prototype = GameObject.prototype;

我对此没有更多问题。之所以阻止我,是因为我有另一个具有add()方法的对象,并使用以下代码检查GameObject的对象是否插入:

 if(object instanceof GameObject)

我不明白这两行可能会发生什么变化,因此当它们出现时继承会中断,我不确定第二种方式继承是好的。有人可以启发我吗?:)


阅读 465

收藏
2020-04-25

共1个答案

一尘不染

如果你这样做

Spaceship.prototype = GameObject.prototype;

然后它们都引用同一个对象,因此,您最好将中的所有内容都包含在内GameObject,如果您向中添加了一些内容Spaceship.prototype,则该对象也将添加到其中GameObject.prototype。您可以通过Spaceship.prototype在分配后添加一些内容来轻松对其进行测试。

至于

Spaceship.prototype = new GameObject();

这将调用可能具有不良副作用的构造函数,而您想使用:

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

这里使用的Object.create功能归结为:

Object.create = function( proto ) {
    function f(){}
    f.prototype = proto;
    return new f;
};

现代浏览器已经具有该功能。

2020-04-25