javascript这会返回未知属性

时间:2012-08-07 16:52:26

标签: javascript jquery ajax oop

我刚刚编写了这段代码,并在警报部分收到错误告诉我,这个字词没有被定义。 我猜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);
        });
    }
}

5 个答案:

答案 0 :(得分: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);
    });
}

答案 1 :(得分: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 );
};

答案 2 :(得分: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);
        });
    }
}

答案 3 :(得分:1)

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

var _self = game;

这样你就可以_self.difficulty_self.words.length等......他们就可以访问它了。

答案 4 :(得分: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);
        });
    }
}

你也想要words的getter,但基本上有一种方法可以通过调用函数来初始化它,而任何其他访问都是通过getter。

未经测试的代码

function game(){ var difficulty = 0; var mode = 0; var words = [];         var that = this; this.loadWords = function() { //请求单词池 $就({ 键入: “GET”, 网址:“word.php” data:{mode:that.mode,difficulty:that.difficulty} 完成(function(html){ 警报(this.words.length); }); } }

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

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