.prototype如何在JavaScript中运行?

时间:2014-09-16 22:15:11

标签: javascript html

我刚刚开始使用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);
    }

1 个答案:

答案 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原型继承的文章,阅读一些并与之一起玩,如果你有它们,可以提出更多问题。 : - )