2011-12-15 7 views
1

多くの人が私の最後の質問で混乱します。私はこれで何かをクリアできることを願っています。ここに私がする必要があるものがあります:呼び出されたときにJavaScript配列の値が自動更新されるようにする

var arr = ["Init Value", "Does Not", "Matter"]; 
arr.onGet = updater; // Register arr with updater function 
alert(arr[0]); // should return 1; 
alert(arr[0]); // should return 2; 
alert(arr[0]); // should return 3; 
alert(arr[0]); // should return 4; 
alert(arr[0]); // should return 5; 

var counter = 0; 
function updater(){ 
    counter = counter + 1; 
    return counter; 
} 

私はそこで何をしましたか?初期値は重要ではありませんが、値を取得するのはアップデータ関数です。

arrが関数アップデータを自動的に呼び出さず、イベントonGetがないため、これはもちろん機能しません。何人かの人は言うかもしれませんが、それはちょうど狂った話です。呼び出されなくても、どのように機能を実行できますか?それは本当ですが、VARIABLEが呼び出されます(この例ではarr [0]なので、arr [0]が呼び出されたときに他の関数にバインド(リンク)することはできませんか?本質的に、これは自動更新。、したがって、私の質問

はまた、私はIE7でこれを仕事にしようとあきらめている、どのようにSKYDでわずかGoogle Chromeの


ソリューションについて:?

function onGet(obj) { 
    var index = 0; 
    var counter = 0; 
    for (var prop in obj) { 
     (function(thisIndex, thisProp) { 
      obj.__defineGetter__(thisIndex, function() { 
       counter = counter + 1; 
       return counter ; 
      }); 
     })(index, prop) 
     index++; 
    }; 
    obj.__defineGetter__("length", function() { 
     return 1000; 
    }); 
    return obj; 
} 

var myObj = [100,200,300]; 

onGet(myObj); 

alert(myObj[1]);  // 1 
alert(myObj[2]);  // 2 
alert(myObj[3]);  // 3 
alert(myObj.length); // 1000 <-- Arbitary value which you can change 
+0

は、私はあなたが本当に知りたい場合は、これは本当に – Ibu

+0

のために使用されているのだろうか、私はコンセプトで唯一除いて存在していない任意の配列を作成しています。任意の数字のように - 有用ですが、物理的な意味では本物ではありません。 – Bill

+0

[JSオブジェクトをARRAYオブジェクトとして使用]の複製が可能です(http://stackoverflow.com/questions/8512405/use-js-function-as-a-array-object) – Neal

答えて

3

あなたはになりますjavascript SettersとGettersは、特定のプロパティがアクセスまたは変更されているときに関数を実行できるようにします。 jects。配列の場合、配列は潜在的に無限のプロパティ(プロパティがその記号)を持つ可能性があるため、少し難しくなります。あなたがが固定サイズの配列を持っている場合は、このような何かがうまくいくかもしれない:

var arr = ["Fixed", "Array", "Size", "Will", "Not", "Ever", "Change"]; 
for (var i=0; i<arr.length; i++){ 
    debug(i); 
    (function(index){ 
     arr.__defineGetter__(index, function(){return updater();});   
    })(i); 
} 
alert(arr[0]) // will return results of updater() call; 

ゲッター/セッターではなく、固定サイズの配列を使用してカスタムオブジェクトを使用する方が良いかもしれません。

はまた、これらのリンクを見て:Getter/setter on javascript array?http://javascriptweblog.wordpress.com/2010/11/15/extending-objects-with-javascript-getters/

+0

申し訳ありませんが、これは正しくありません。私の答えを編集中です。 – Skyd

+0

Skyd、あなたは素晴らしいです、それは動作します!どうもありがとう!実際にはかなりうまく機能しています。私はコードをOPに1秒で投稿します。 – Bill

+0

私のオリジナルの質問にクレジットを入れたいのであれば、http://stackoverflow.com/questions/8512405/でソリューションを投稿してください。 – Bill

関連する問題