2017-01-25 11 views
1

私はJavascriptでは比較的新しいので、継承の過程で混乱します。 このコードスニペットでは、私はフェイザーのチュートリアルから得たBulletはスプライトを継承しています。最初は私の知るところではあるメソッドからプロパティを取り出し、それを別のメソッドに挿入するcallメソッドを使用します。したがって、この時点でBulletにはSpriteのすべてのプロパティが与えられます。コールはオブジェクトを取得し、オブジェクトのパラメータを呼び出す必要があるので、なぜゲームとキーを渡しているのか理解していますが、0,0はどこから来ますか?Javascript継承.call .create and constructor

大丈夫ですが、その後、Bullet.prototype = Object.createを実行して、弾丸プロトタイプにスプライトオブジェクトを作成しますか?しかし、コールメソッドですでにそれをしていませんか?

そしてそれはprototype.constructor = bulletになりますが、なぜ弾丸が既に弾丸を持っているときにそれを行う必要がありますか?

誰かが私にこれを説明できるなら、私は非常に感謝します。ありがとうございました!

var Bullet = function (game, key) { 

    Phaser.Sprite.call(this, game, 0, 0, key); 

    this.texture.baseTexture.scaleMode = PIXI.scaleModes.NEAREST; 

    this.anchor.set(0.5); 

    this.checkWorldBounds = true; 
    this.outOfBoundsKill = true; 
    this.exists = false; 

    this.tracking = false; 
    this.scaleSpeed = 0; 

}; 

Bullet.prototype = Object.create(Phaser.Sprite.prototype); 
Bullet.prototype.constructor = Bullet; 

答えて

1

私はあなたに良いリンクがあったらいいですか?しかし、とにかく...

すべてのコンストラクタ関数は、オブジェクトとして作成されたときに初期化されたプロトタイププロパティを持ち、constructorプロパティでコンストラクタ関数自体を設定します。関数のprototypeとプロトタイプのconstructorプロパティの両方が読み書き可能であり、更新することができます。

オブジェクトはコンストラクタ関数を使用して作成されたオブジェクトがを作成した時点で、コンストラクタ関数のprototypeプロパティに保持されたオブジェクトの値からプロパティを継承します。このプロトタイプオブジェクトは、独自のコンストラクタのプロトタイププロパティからプロパティを継承し、継承チェーンを設定することができます。

Object.createは、最初のパラメータとして渡されたオブジェクトから継承する新しいオブジェクトを返すファクトリ関数です。返されるオブジェクトは、コンストラクタプロパティをObject.createに提供されたオブジェクトから継承します。ローカルプロパティの場合は直接、オブジェクトのプロトタイプチェーンの場合は間接的に継承されます。新しい弾丸オブジェクトのPhaser.Spriteを呼び出す


  1. Phaser.Spriteコンストラクタによって作成されたローカルのプロパティを追加します。

  2. Bullet.prototype = Object.create(Phaser.Sprite.prototype);は、Phaser.Sprit.prototypeから直接継承するオブジェクトを作成します。 Bulletオブジェクトは、Bulletオブジェクトの不整合チェーンを介して、すべてのSpriteのプロトタイプ値を間接的に継承します。

  3. Bullet.prototype.constructor = Bullet;は、Bullet.prototypeにローカルのconstructorプロパティを作成します。これは、Bulletオブジェクトによって継承されます。このステップがなければ、継承チェーンを介してプロパティ値Spriteを継承します。