0

我正在尝试在函数下分配属性。我有

test.prototype.getName = function(){
    var myself=this;

     //ajax callback function
      call.callback = function(obj){

     //I want to assign returned ajax obj to test property.       
        myself.testName=obj;
      }

}


test.prototype.build = function(){

this.getName();

console.log(this.testName)//undefined...

}


test.build();

如何获取我的构建函数中显示的 this.testName?非常感谢!

4

3 回答 3

1

根据您提供的代码,我做出以下假设:

假设1:

您已将测试初始化​​为返回某个对象或函数的函数,但未在您的问题中包含该代码。这称为构造函数。我认为它看起来像:



    function test(){
        //do some work here
        return this;
    }

//or

    var test = function(){
        //do some work here
        return this;
    }

我假设这是因为您能够设置原型的属性而不会引发错误,以上将允许您这样做。

假设2:

我假设您正在尝试使用一些涉及多个测试对象实例的面向对象的解决方案。这个假设是基于您的目标是使用原型继承这一事实,如果您的“测试”函数只有一个版本(这称为单例),这一点就不那么重要了。

基于这些假设,问题在于您没有创建测试对象的实例。以下代码应该可以正常工作(依赖于假设 1);



    var testInstance = new test();
    testInstance.build();
    // wait for AJAX to return and execute success handler
    testInstance.property // returns a proper value

如果 build 是你只会做一次的事情,并且你想为测试对象的每个实例做一些事情,那么你可以将它放入构造函数本身:



    function test(){
        this.build();
        return this;
    };
    
    
    var testInstance = new test();
    // wait for AJAX to return and execute success handler
    testInstance.property // returns a proper value

这是一个完整的测试,setTimeout用作异步调用



    function Test(){
        //do anything
        return this
    };
    Test.prototype.getName = function(){
        var self = this;
    
        //simulate AJAX with setTimeout
        setTimeout(
        function(){
            self.testName = "Ahmad Jamal";
            console.log('name set');   
        }, 1000);
    };
    Test.prototype.build = function(){
        this.getName();
        console.log(this.testName); // this is undefined, as the setTimeout is still waiting
    };
    
    var test = new Test();
    
    test.build();
    // now wait to see 'name set' in the console
    
    test.testName; // returns "Ahmad Jamal"

于 2012-12-17T23:19:33.270 回答
1

鉴于异步函数的性质,您必须使用回调函数。console.log用to传递函数getName,并在异步操作完成时执行它:

test.prototype.getName = function(callback){
    var myself=this;

    //ajax callback function
    call.callback = function(obj){

        //I want to assign returned ajax obj to test property.       
        myself.testName=obj;
        callback();
    }
}

test.prototype.build = function(){ 
    var myself = this;

    this.getName(function() {
        console.log(myself.testName)
    });
}
于 2012-12-17T19:44:54.050 回答
0

像这样的东西?

function MyClass () {}

function test () {}

test.prototype = new MyClass();

test.prototype.getName = function(callback){
    this.testName = callback();
};

test.prototype.build = function(){
    this.getName(function() {
        return 'this is my test name';
    });
    console.log(this.testName);
}

var myobj = new test();
myobj.build();
于 2012-12-17T20:33:17.657 回答