Javascript构造函数不工作

时间:2013-09-29 20:50:57

标签: javascript oop

我在gamedev.stackexchange上发布了这个,但是在这里提到了,所以我会试试。我有一个简单的菜单,它是一个函数,mainmenu.prototype.Render将它绘制到屏幕上。在mainmenu函数中,我想创建一个包含按钮x,y位置和.src的对象数组。

这是我当前的代码,所以函数本身没问题:

this.Mainmenu = function() {
}

this.Mainmenu.prototype.Render = function() {
    imgPause = new Image();
    imgPause.src = 'img/pause.png';

    c.drawImage(imgPause, canvas.width - 42, 10);
}
var mainmenu = new self.Mainmenu();

我希望最终结果看起来像,但无法开始工作(我在评论中包含了错误):

this.Mainmenu = function() {
    this.button = function(src, X, Y) {
        this = new Image(); // Gives error "Invalid left-hand side in assignement"
        this.src = src;
        this.X = X;
        this.Y = Y;
    }
    this.buttons = [pause = new this.button(src, X, Y)];
}

this.Mainmenu.prototype.Render = function() {
    for (i = 0; i < this.buttons.length; i++) {
        c.drawImage(this.src, this.X, this.Y);
    }
}
var mainmenu = new self.Mainmenu();

但它不起作用,如果有人能够确定我的错误在哪里会受到赞赏,我的耐心即将耗尽。

2 个答案:

答案 0 :(得分:2)

好吧,你的错误正是你的js口译员所说的 - 你的作业左侧无效。也就是说,您无法将this分配给任何内容,这是所有具有this字词的语言的经验法则。这背后的原因很明显 - this表示函数的当前上下文,它的隐含参数。如果你可以动态地覆盖它,你可以改变使用你的每个函数的行为,从而改变整个程序。

如何以这种破碎方式使用this

this.MainMenu = function() {
    this.Button = function(src, X, Y) {
        var image = new Image();
        image.src = src;
        image.X = X;
        image.Y = Y;
        return image;
    }
    this.buttons = [pause = new this.Button(src, X, Y)];
}

另外,使用PascalCase(Button而不是button)命名您的类,并使用camelCase命名您的变量(x,而不是X)。

答案 1 :(得分:0)

你不能这样做

this.button = function(src, X, Y) {
    this = new Image(); // Gives error "Invalid left-hand side in assignement"
}

this代表Mainmenu的当前实例。您无法覆盖另一个实例 实例。 没意义。