如何在功能下分配财产?

时间:2012-12-17 19:41:38

标签: javascript

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

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?非常感谢!

3 个答案:

答案 0 :(得分:1)

鉴于异步函数的性质,您必须使用回调函数。将函数与console.log一起传递给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)
    });
}

答案 1 :(得分:1)

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

假设1:

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



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

//or

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

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

假设2:

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

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



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

如果构建是你只需要执行一次以及你想为测试对象的每个实例做些什么,那么你可以将它放入构造函数本身:



    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"

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