2011-12-07 15 views
0

これはすでに解決済みですが、ここで適切な答えが見つかりませんでした。それが事実なら謝罪する。ここで問題です:Javascript OOPクラス - 関数へのプロパティの割り当て

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) 

結果:「最初の値」、次に「未定義」 データVaRはpulldataの範囲外の利用できない、と私はこの問題に対処する最善の方法だかわからないんだけど。

答えて

3

あなたpullData()機能は、実際には、明示的には何も返しません。戻り値は定義されていません。つまり、obj.value2をログに記録したときに表示される内容は正しいですが、望ましくありません。 pullData()インサイド

あなたは$.getJSON()を呼び出し、コールバックとしてそれを無名関数を渡し、それがdataを返す匿名関数ですが、AJAX呼び出しが非同期であるため、戻り値はどこにも行かないと、コールバックが発生していないされています後になるまで。

あなたはこの試みることができる:$.getJSON()からの結果は後に、すなわち、クラスの準備ができたときに実行されるコールバック関数であるパラメータを取るためにあなたのAclass()コンストラクタを設定されている

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); 
}); 

を利用可能です。

+0

素晴らしいデモンストレーション、これはちょうどそれと同じように動作する必要があります。ありがとう。 –

1

$ .getJSONは、 "data.json" URLに対して非同期のajax呼び出しを行います。あなたが与えた2番目の引数はコールバックです。コールバックはajax呼び出しが終了したときに呼び出されます。 しかし、あなたのpulldata関数は答えを待たずに実行されるだけなので、未定義に戻ります。

非同期呼び出しで何をしようとしているのか正確にはできません(同期呼び出しを使用しないでください)。

代わりにコールバックであなたのものを行うためにコードを書き直す必要があります。コールバックはあなたの "function(data){}"引数です。

あなたが呼び出された関数は非同期でなかった場合ただし、これは、JSの範囲がどのように動作するかであり、あなたの問題を解決してきたはずです。そのよう

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

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

右。説明をいただきありがとうございます。私はそれらの行に沿って何かを疑った。私はJSONで最初にロードしてコールバックでクラスをインスタンス化する方が賢明だと思います。 –