0

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

在这种情况下,我无法访问 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;
    }
}
4

1 回答 1

3

好的,所以有很多要点:

第一的

在原型创建时,请声明变量。现在您正在创建“test”、“callback”和“getRequest”全局变量,因为您不使用“var”

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

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

    // And more code...
};

“测试”声明末尾的逗号是有效的,因为它是一个运算符,但我很确定它不是你想要做的。

或者你可以直接创建函数:

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

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

    // And more code...
};

第二

您正在将“原型”属性分配给函数

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

这意味着你的类的原型是一个函数,它有方法“call”、“apply”、“bind”,但没有“test”或“callback”。可能您想创建一个立即调用函数表达式 (IIFE)

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

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

或者一个简单的对象:

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

第三

我不明白你的代码在做什么,“MyClass2”在哪里定义,它扩展了“MyClass1”?

第四

您正在将 MyClass1 原型上的“test”属性分配给一个函数,但是在构造函数上,您将“test”属性分配给一个数字,也许您想使用不同的属性。

第五

在这条线上:

success: callBack.call(this, data)

您正在调用函数“回调”(我不知道它来自哪里),我再说一遍,您正在调用它,而不是将其设置为回调,您只是调用函数并告诉 $.ajax 而不是回调将是“callback.call(this, data)”返回的值,可能是“未定义”。

如果您想将“回调”函数设置为 ajax 请求的回调,您需要传递一个函数,并且在该函数内部,您可以在数组到达时执行任何您想做的事情,在这种情况下调用“回调”,但您必须保存“this”变量以使用它:

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

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

如您所见,当代码未经测试时,很难给出准确的响应,所以下次请提供您的代码。

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

于 2012-10-08T22:52:27.467 回答