2017-01-25 145 views
1

我在JavaScript中比較新,我對繼承過程感到困惑。 在這段代碼片段中,我從一個相位器教程中得到,子彈繼承了精靈。首先它使用了我所知的調用方法,它從一個方法獲取屬性並將其插入到另一個方法中。所以在這一點上,Bullet被賦予了Sprite的所有屬性。調用應該接受一個對象,然後調用被調用對象的參數,所以我明白爲什麼它傳遞了遊戲和關鍵字,但是0,0從哪裏來?Javascript繼承.call .create和構造函數

好吧,但畢竟它確實Bullet.prototype = Object.create創建sprite對象到子彈原型?但是,它是否已經通過調用方法來做到這一點?

然後它會去prototype.constructor =子彈,但爲什麼你需要這樣做,當子彈已經持有子彈?

如果有人能向我解釋這一點,我會非常感激。謝謝!

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屬性中保存的對象值繼承屬性。這個原型對象繼而可以從它自己的構造函數的prototype屬性繼承屬性,所以建立一個繼承鏈。

Object.create是一個工廠函數,它返回從作爲第一個參數傳遞的對象繼承的新對象。返回的對象將從提供給Object.create的對象繼承它的構造函數屬性,如果它是本地屬性,或者直接從對象的原型鏈間接獲取。


  1. 調用一個新的子彈物體上Phaser.Sprite只增加了由Phaser.Sprite構造函數創建的本地屬性。

  2. Bullet.prototype = Object.create(Phaser.Sprite.prototype);創建一個直接從Phaser.Sprit.prototype繼承的對象。 Bullet對象現在將通過Bullet對象的互動鏈間接繼承所有Sprite的原型值。

  3. Bullet.prototype.constructor = Bullet;在子彈對象繼承的Bullet.prototype上創建本地constructor屬性。沒有這一步,他們會通過繼承鏈繼承屬性值Sprite