Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript OOP类-将属性分配给函数_Javascript_Jquery_Oop - Fatal编程技术网

Javascript OOP类-将属性分配给函数

Javascript OOP类-将属性分配给函数,javascript,jquery,oop,Javascript,Jquery,Oop,也许这个问题已经解决了,但在这里找不到合适的答案。如果是这样的话,我会道歉。问题是: function Aclass(){ this.value1 = "a first value" this.value2 = pulldata() function pulldata(){ $.getJSON("data.json",function(data){ return data }) } } var obj

也许这个问题已经解决了,但在这里找不到合适的答案。如果是这样的话,我会道歉。问题是:

function Aclass(){

    this.value1 = "a first value"
    this.value2 = pulldata()

    function pulldata(){
        $.getJSON("data.json",function(data){
            return data
        })
    }
}

var obj = new Aclass()
console.log(obj.value1)
console.log(obj.value2)
结果:“第一个值”然后是“未定义”
数据变量在pulldata的作用域之外不可用,我不确定最好的解决方法是什么。

$。getJSON对“data.json”URL进行异步ajax调用。您给它的第二个参数是回调,它在ajax调用完成时被调用。 然而,您的pulldata函数只是在不等待答案的情况下运行,因此返回undefined

对于异步调用,不可能精确地执行您正在尝试执行的操作(而且您永远不应该使用同步调用)

你必须重写你的代码来完成回调中的工作。回调是“函数(数据){}”参数

但是,如果您调用的函数不是异步的,那么JS作用域就是这样工作的,应该解决您的问题:

function Aclass() {
    var that = this;
    this.value2 = 'not set';

    var pullData = function() {
        someCallToSomethingWithACallback(function() {
            that.value2 = 'set';
        }
    }
}

$.getJSON对“data.json”URL进行异步ajax调用。您给它的第二个参数是回调,它在ajax调用完成时被调用。 然而,您的pulldata函数只是在不等待答案的情况下运行,因此返回undefined

对于异步调用,不可能精确地执行您正在尝试执行的操作(而且您永远不应该使用同步调用)

你必须重写你的代码来完成回调中的工作。回调是“函数(数据){}”参数

但是,如果您调用的函数不是异步的,那么JS作用域就是这样工作的,应该解决您的问题:

function Aclass() {
    var that = this;
    this.value2 = 'not set';

    var pullData = function() {
        someCallToSomethingWithACallback(function() {
            that.value2 = 'set';
        }
    }
}
您的
pullData()
函数实际上没有显式返回任何内容,因此它的返回未定义-这意味着您在记录obj.value2时看到的内容是正确的(尽管不需要)

pullData()
内部调用
$.getJSON()
并将匿名函数作为回调传递给它,正是该匿名函数返回
数据
,但由于ajax调用是异步的,回调要到稍后才会发生,因此返回不会出现

你可以试试这个:

function Aclass(classInitialisedCallback){
    var self = this;

    this.value1 = "a first value";
    this.value2 = "not available yet";

    $.getJSON("data.json",function(data){
        self.value2 = data;
        if (typeof classInitialisedCallback === "function")
           classInitialisedCallback(self);
    });
}

var obj = new Aclass(function(newInstance) {
   // can use obj or newInstance to refer to the object
   console.log(obj.value1);
   console.log(newInstance.value2);
});
也就是说,设置
Aclass()
构造函数以获取一个参数,该参数是类准备就绪时要执行的回调函数,即在
$的结果可用后。getJSON()
函数实际上不会显式返回任何内容,因此,它的返回是未定义的——这意味着您在记录obj.value2时看到的内容是正确的(尽管不是期望的)

pullData()
内部调用
$.getJSON()
并将匿名函数作为回调传递给它,正是该匿名函数返回
数据
,但由于ajax调用是异步的,回调要到稍后才会发生,因此返回不会出现

你可以试试这个:

function Aclass(classInitialisedCallback){
    var self = this;

    this.value1 = "a first value";
    this.value2 = "not available yet";

    $.getJSON("data.json",function(data){
        self.value2 = data;
        if (typeof classInitialisedCallback === "function")
           classInitialisedCallback(self);
    });
}

var obj = new Aclass(function(newInstance) {
   // can use obj or newInstance to refer to the object
   console.log(obj.value1);
   console.log(newInstance.value2);
});

也就是说,设置
Aclass()
构造函数以获取一个参数,该参数是类准备就绪时(即,
$)的结果可用后要执行的回调函数。

对。谢谢你的澄清,这很有意义。我怀疑有类似的事情。我想最好先加载JSON,然后在回调上实例化这个类,对吧。谢谢你的澄清,这很有意义。我怀疑有类似的事情。我想最好先加载JSON,然后在回调上实例化这个类,对吧。很好的演示,这是它应该做的。谢谢,好的。很好的演示,这是它应该做的。谢谢