2017-01-25 144 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