8

私は常に次のように定義されているのを見てきた継承のための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プロパティが GameObject ではなく Spaceship に設定されていることがわかります。それらを削除すると、GameObject に設定されます。

そして、私が使用する場合:

 Spaceship.prototype = GameObject.prototype;

私はそれでもう問題はありません。これが私をブロックする理由は、 add() メソッドを持つ別のオブジェクトがあり、オブジェクトが次のコードで GameObject の inerhis をチェックするためです:

 if(object instanceof GameObject)

これらの 2 つの行がおそらく変更される可能性があるため、それらが存在するときに継承が壊れる可能性があることを理解していません。誰かがこれについて私に教えてもらえますか? :)

4

3 に答える 3

14

もしあなたがそうするなら

Spaceship.prototype = GameObject.prototype;

次に、それらは両方とも同じオブジェクトを参照するため、 にすべてが含まれている可能性があり、GameObjectに何かを追加するとSpaceship.prototype、 にも追加さGameObject.prototypeれます。Spaceship.prototype割り当ての後に何かを追加することで、簡単にテストできます。たとえば、あなたの場合、GameObject.prototype.constructor実際にはSpaceship.

はどうかと言うと

Spaceship.prototype = new GameObject();

これは、望ましくない副作用をもたらす可能性のあるコンストラクターを呼び出します。

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

ここで使用されるObject.create機能は次のとおりです。

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

ただし、最新のブラウザにはすでに機能があります。

于 2012-06-18T17:59:21.003 に答える
0
function GameObject(oImg, x, y) {

    this.x = x;
    this.y = y;
    this.img = oImg || {width:null, height: null};

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

}


function Spaceship(){
    GameObject.apply(this, arguments);
    this.vx = 0;
    this.vy = 0;
    this.speed = 3;
    this.friction = 0.94;
}
Spaceship.prototype = new GameObject();

var sps1 = new Spaceship();
var sps2 = new Spaceship();

sps1.hitBox.x = 9;
sps2.hitBox.x = 12;
console.log(sps1.hitBox.x);  // 9
console.log(sps2.hitBox.x);  // 12
于 2015-05-23T15:53:37.543 に答える