2

我刚刚编写了那段代码,并在警告部分收到错误消息,告诉我 this.words 没有定义。我猜 jquery 部分更改了“this”值,因为在注释所在的位置,我可以访问数组。

现在我卡住了,因为我不想让单词属性全局(是什么让它运行)。所以我想问你一种在保持“OOP”风格的同时解决问题的方法。

function game()
{
    this.difficulty = 0;
    this.mode = 0;
    this.words = new Array();

    this.loadWords = function()
    {
        //request word pool
        $.ajax({
            type:"GET",
            url:"word.php",
            data:{mode:this.mode, difficulty:this.difficulty}
        }).done(function(html) {
            alert(this.words.length);
        });
    }
}
4

5 回答 5

3

这似乎是一个范围界定问题。this不再引用.done函数内的游戏对象。尝试

this.loadWords = function()
{
    var that = this;
    //request word pool
    $.ajax({
        type:"GET",
        url:"word.php",
        data:{mode:this.mode, difficulty:this.difficulty}
    }).done(function(html) {
        alert(that.words.length);
    });
}
于 2012-08-07T16:55:08.057 回答
3
function Game()
{
    this.difficulty = 0;
    this.mode = 0;
    this.words = new Array();
    this.wordsLoaded = $.proxy(this.wordsLoaded, this);
}

var method = Game.prototype;

method.loadWords = function() {

    $.ajax({
        type:"GET",
        url:"word.php",
        data:{mode:this.mode, difficulty:this.difficulty},
        success: this.wordsLoaded
    });

};

method.wordsLoaded = function() {
    alert( this.words.length );
};
于 2012-08-07T16:55:48.000 回答
2

处理程序中的值this已更改,`done()因此它不再是您的对象。您可以通过将副本保存this到另一个变量中来修复它,如下所示:

function game()
{
    this.difficulty = 0;
    this.mode = 0;
    this.words = new Array();

    this.loadWords = function()
    {
        var self = this;
        //request word pool
        $.ajax({
            type:"GET",
            url:"word.php",
            data:{mode:this.mode, difficulty:this.difficulty}
        }).done(function(html) {
            alert(self.words.length);
        });
    }
}
于 2012-08-07T16:54:14.457 回答
1

通过执行以下操作在内部保存游戏功能:

var _self = game;

那样你做_self.difficulty,,_self.words.length等等......他们将能够访问它。

于 2012-08-07T16:54:36.363 回答
0

你可以看看

http://javascript.crockford.com/private.html

有关 javascript 中私有、受保护和公共的更多想法,但这里有一个解决方案:

未经测试的代码

function game() {
    var difficulty = 0;
    var mode = 0;
    var words = [];
    this.loadWords = function()
    {
        //request word pool
        $.ajax({
            type:"GET",
            url:"word.php",
            data:{mode:this.mode, difficulty:this.difficulty}
        }).done(function(html) {
            alert(this.words.length);
        });
    }
}

您也需要一个 getter words,但基本上有一种方法可以初始化它,通过调用函数和任何其他访问是通过 getter。

未经测试的代码

    function game() { var 难度 = 0; 变种模式= 0;变种词= [];var that = this; this.loadWords = function() { //请求词池 $.ajax({ type:"GET", url:"word.php", data:{mode:that.mode,difficult:that.difficulty} }).完成(函数(html){警报(this.words.length);});} }

我添加了一个that变量并将其设置为this, 以帮助包含该值,但在 ajax 调用中直接调用mode变量可能就足够了,但可能需要使用that. 此外,this函数之前可能是一个问题,不确定,我需要使用调试器来查看实际发生的情况并查看实际使用的内容。

我错过了this.ajax 调用的内部,这是最初的问题。

于 2012-08-07T17:04:05.330 回答