Javascript继承.call .create和构造函数

时间:2017-01-25 01:13:48

标签: javascript inheritance

我在Javascript上相对较新,我对继承过程感到困惑。 在这个代码片段中,我从一个phaser教程中获得,Bullet继承自sprite。首先,它使用call方法,根据我的知识,从一个方法获取属性并将其插入另一个方法。所以在这一点上,Bullet被赋予了Sprite的所有属性。调用应该接受一个对象,然后调用被调用对象的参数,所以我理解为什么它传递游戏和密钥,但是0,0来自哪里?

好的,但是毕竟它是Bullet.prototype = Object.create来创建sprite对象到子弹原型?但是没有用调用方法做到这一点吗?

然后它变成了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 个答案:

答案 0 :(得分:1)

我希望我能为你提供一个很好的链接。但无论如何......

当函数创建为具有constructor属性的对象时,所有构造函数都初始化了一个prototype属性,该属性设置了构造函数本身。函数的prototype和原型的constructor属性都是可读写的,可以更新。

使用构造函数创建的对象从创建对象时构造函数的prototype属性中保存的对象值继承属性。这个原型对象可以依次从自己的构造函数的prototype属性继承属性,从而建立一个继承链。

Object.create是一个工厂函数,它返回一个新对象,该对象继承自作为第一个参数传递的对象。返回的对象将从提供给Object.create的对象继承其构造函数属性,如果它是本地属性,则直接从对象的原型链继承。

  1. 在新的Bullet对象上调用Phaser.Sprite只会添加Phaser.Sprite构造函数创建的本地属性。

  2. Bullet.prototype = Object.create(Phaser.Sprite.prototype);创建一个直接从Phaser.Sprit.prototype继承的对象。 Bullet对象现在将通过Bullet对象的inerhitance链间接继承所有Sprite的原型值。

  3. Bullet.prototype.constructor = Bullet;constructor上创建一个由Bullet对象继承的本地Bullet.prototype属性。如果没有这一步,他们将通过继承链继承属性值Sprite