我在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;
答案 0 :(得分:1)
我希望我能为你提供一个很好的链接。但无论如何......
当函数创建为具有constructor
属性的对象时,所有构造函数都初始化了一个prototype属性,该属性设置了构造函数本身。函数的prototype
和原型的constructor
属性都是可读写的,可以更新。
使用构造函数创建的对象从创建对象时构造函数的prototype
属性中保存的对象值继承属性。这个原型对象可以依次从自己的构造函数的prototype属性继承属性,从而建立一个继承链。
Object.create
是一个工厂函数,它返回一个新对象,该对象继承自作为第一个参数传递的对象。返回的对象将从提供给Object.create
的对象继承其构造函数属性,如果它是本地属性,则直接从对象的原型链继承。
在新的Bullet对象上调用Phaser.Sprite
只会添加Phaser.Sprite
构造函数创建的本地属性。
Bullet.prototype = Object.create(Phaser.Sprite.prototype);
创建一个直接从Phaser.Sprit.prototype
继承的对象。 Bullet
对象现在将通过Bullet对象的inerhitance链间接继承所有Sprite的原型值。
Bullet.prototype.constructor = Bullet;
在constructor
上创建一个由Bullet对象继承的本地Bullet.prototype
属性。如果没有这一步,他们将通过继承链继承属性值Sprite
。