0

我目前正在为我正在使用 createjs 框架在 javascript 中制作的游戏编写场景结构。我遇到的问题是正确引用原型函数中的原始类。我对 javascript 比较陌生,这是我第一次不得不使用原型。我目前的代码如下:

function Intro(p, c){
    this.parent = p;
    var s = new createjs.Stage(c);
    this.stage = s;

    this.queue = new createjs.LoadQueue(false);
    this.queue.installPlugin(createjs.Sound);
    this.queue.addEventListener("complete", this.handleComplete);
    this.queue.loadManifest([{id:"bg", src:"images/Intro/intro_background.png"}]);
}
Intro.prototype.handleComplete = function(event){
    console.log("queue completed - handling...");
    var q = event.target;
    var bg = new createjs.Bitmap(q.getResult("bg"));
    this.stage.addChild(bg);
    this.stage.update();
}

当我到达

this.stage.addChild(bg);

它似乎失去了范围,我得到“无法调用未定义的方法'addChild'。

任何帮助将不胜感激!-xv

4

2 回答 2

0

您可以通过更改来解决范围问题

this.queue.addEventListener("complete", this.handleComplete);

this.queue.addEventListener("complete", this.handleComplete.bind(this));

所以绑定函数的范围是this.

顺便说一句,您可能对我覆盖 createjs 类(https://github.com/Canop/SpaceBullet/tree/master/src)的游戏感兴趣。我想我以一种干净的方式处理了这个问题。

于 2013-09-23T15:20:58.710 回答
0

如果你在 JS 中调用函数,它会被动态绑定。将绑定什么值this取决于您调用它的方式、函数是否作为构造函数调用以及您的代码是否在严格模式下运行。

在您的情况下,以下行:

this.queue.addEventListener("complete", this.handleComplete);

使您的函数在this绑定到全局对象的情况下运行(在 Web 浏览器中,全局对象是一个window对象),或者,如果在严格模式下,this将是未定义的。

正如@dystroy 建议的那样,使用bind()方法来改变这种行为。来电:

this.queue.addEventListener("complete", this.handleComplete.bind(this));

this导致在 中的绑定与在handleComplete()中相同。thisIntro


如果您想更详细地了解它。我强烈建议阅读Dmitry Soshnikov 的博客

于 2013-09-23T15:26:00.627 回答