在ajax调用之后,原型模型中的构造函数变量无法访问

时间:2012-09-28 12:51:35

标签: javascript prototype-programming

当我使用回调从异步调用返回时,我无法访问类的构造函数。

在这种情况下,我无法访问Myclass1构造函数中定义的测试变量

我无法找到解决方案,我做错了什么?

var MyClass1 = function () {

    this.test = 5;
};
MyClass1.prototype = function () {
    //This is the function which calls another Myclass2 which contains the function for ajax //request
    test = function () {
        myClass2 = new MyClass2();
        myClass2.getRequest.call(this, callback);
    },
    //This is the call Back
    callback = function () {
        alert(this.test); /*<---Cannot access this,shows undefined.In firebug it show this.test is not defined*/
    };

    return {
        test: test,
        callback: callback
    }
}

MyClass2.prototype = function () {
    getRequest = function () {
        //make an async call set the success to the callback .I have propagated the data to //myclass1
        $.ajax({
            url: "test.html",
            success: callBack.call(this, data) //<--I call the callback using myClass1
        })
    }

    return {
        getRequest: getRequest;
    }
}

1 个答案:

答案 0 :(得分:3)

好的,所以有很多要点:

<强>第一

在原型创建上,请声明变量。现在你正在创建&#34;测试&#34;,&#34;回调&#34;和&#34; getRequest&#34;全局变量,因为你不使用&#34; var&#34;

MyClass1.prototype = function () {
    var test = function () {
        // some code...
    };

    var callback = function () {
        // some code...
    };

    // And more code...
};

&#34;测试结束时的逗号&#34;声明是有效的,因为它是一个操作员,但我很确定它不是你的意思。

或者您可以直接创建功能:

MyClass1.prototype = function () {
    function test() {
        // some code...
    }

    function callback() {
        // some code...
    }

    // And more code...
};

<强>第二

您正在分配&#34;原型&#34;属性到函数

MyClass1.prototype = function() { ... };

这意味着你的班级的原型是一个功能,他有方法&#34; call&#34;,&#34; apply&#34;,&#34; bind&#34;但不是&#34;测试&#34;也没有&#34;回调&#34;。可能你想创建一个立即调用的函数表达式(IIFE)

MyClass1.prototype = (function() {
    function methodA() {
        // some code...
    }

    return {
        methodA: methodA
    };
})();

或一个简单的对象:

MyClass1.prototype = {
    methodA: function() {
        // some code...
    },
    methodB: function() {
        // some code...
    }
};

<强>第三

我不明白你的代码在做什么,在哪里&#34; MyClass2&#34;定义,它扩展&#34; MyClass1&#34;?

<强>四

您正在分配&#34;测试&#34;将MyClass1的原型属性转换为函数,但是然后,在构造函数上指定&#34; test&#34;财产到一个数字,也许你想使用不同的属性。

<强>第五

在这一行:

success: callBack.call(this, data)

您正在调用函数&#34;回调&#34; (我不知道它来自哪里),我再说一遍,你正在调用它,而不是将它设置为回调,你只是调用函数并告诉$ .ajax而不是回调将是&#34; callback.call(this,data)&#34;返回的值,可能&#34; undefined&#34;。

如果你想设置&#34;回调&#34;函数作为ajax请求的回调你需要传递一个函数,在这个函数内部你做任何你想做的事情,当数组到达时,在这种情况下调用&#34;回调&#34;,但你必须保存&#34; ;这&#34;变量以便使用它:

var self = this;
$.ajax({
    url: "test.html",
    success: function(data) {
        callBack.call(self, data);
    }
})

我认为数据变量来自ajax请愿书......

正如您所看到的那样,在未对代码进行测试时,确实难以给出准确的响应,以便下次请提供您的代码。

如果我的所有假设都是正确的:这是一个类似你需要的代码:http://jsfiddle.net/pw3hj/