我刚刚开始使用JavaScript和HTML5进行游戏开发教程。 javascript.prototype已经发挥了很多次。我真的不明白它是如何工作的。这是我发现的一个很好的解释链接,但我仍然有点困惑
How does JavaScript .prototype work?。
有人可以解释一下吗? 以下是我的代码示例:
function Enemy(){
this.srcX = 140; //gets the location of enemy in x and Y here
this.srcY = 600;
this.width = 45;//gets the enemies width and height here
this.height = 54;
this.drawX = randomRange(0, canvasWidth - this.width);
this.drawY = randomRange(0, canvasHeight - this.height);
this.centerX = this.drawX + (this.width / 2);
this.centerY = this.drawY +(this.height / 2);
//this.targetX = this.centerX;
//this.targetY = this.centerY;
//this.randomMoveTime = randomRange(4000,10000);
this.speed = 1;
//var that = this;
//this.moveInterval = setInterval(function() {that.setTargetLocation();},that.randomMOveTime);
this.isDead = false;
}
Enemy.prototype.update = function() {
//this.checkDirection();
this.centerX = this.drawX + (this.width / 2);
this.centerY = this.drawY + (this.height / 2);
}
答案 0 :(得分:1)
我认为原型继承最大的困惑是对象通过其内部[[Prototype]]
属性从其构造函数的原型继承。两者都被称为"原型"。所有函数都有一个默认的 prototype 属性,它是一个空对象。
在你的情况下:
function Enemy(){
this.srcX = 140; //gets the location of enemy in x and Y here
this.srcY = 600;
...
}
是一个函数,当使用 new 调用时,它充当将属性分配给自身的新实例的构造函数。该实例有一个内部[[Prototype]]
属性,指向 Enemy.prototype 。
然后:
Enemy.prototype.update = function() {
//this.checkDirection();
this.centerX = this.drawX + (this.width / 2);
this.centerY = this.drawY + (this.height / 2);
}
这会为 Enemy.prototype 指定一个新属性,这是一个函数。因此,在 Enemy 的所有实例的继承链上放置 update 属性,因此它们都继承了 update 方法。
所以:
var enemy0 = new Enemy();
var enemy1 = new Enemy();
typeof enemy0.update // function
typeof enemy1.update // function
enemy0.update === enemy1.update // true
只有当两个表达式引用同一个对象(即分配给 Enemy.prototype.update 的函数)时,测试才能成立。
您可以继续向 Enemy.prototype 添加属性和方法,它们将被所有实例继承,即使是已构建的实例也是如此。但是如果你把它改成另一个对象:
Enemy.prototype = {update:function(){/*new update function*/}};
然后旧实例仍将具有旧[[Prototype]]
,新实例将具有新实例。
网上有一百万篇关于javascript原型继承的文章,阅读一些并与之一起玩,如果你有它们,可以提出更多问题。 : - )