我試圖做類似延遲加載參數值
var foo = {
bar: '' // do some magic here
};
,只有當我需要使用的值(後來在頁面上)只是簡單地調用屬性將運行延遲加載,然後回傳值
典型的例子是我有一個restfull API在頁面打開時加載用戶。 進入菜單後,我想訪問與其相關的屬性(另一個對象),但它在另一個API中,我不想在開頭加載所有。
有財產調用的某種類型的監聽器嗎?
我試圖做類似延遲加載參數值
var foo = {
bar: '' // do some magic here
};
,只有當我需要使用的值(後來在頁面上)只是簡單地調用屬性將運行延遲加載,然後回傳值
典型的例子是我有一個restfull API在頁面打開時加載用戶。 進入菜單後,我想訪問與其相關的屬性(另一個對象),但它在另一個API中,我不想在開頭加載所有。
有財產調用的某種類型的監聽器嗎?
使用Object.definePropery
動態計算foo.bar
。它在all modern browsers工作。
var foo = { };
Object.defineProperty(
foo,
"bar",
{
get: function() {
return 'magic return value';
}
}
);
的jsfiddle:http://jsfiddle.net/wFYxb/
您也可以緩存get()中的值,以便僅調用一次api調用。 –
@MukeshSoni肯定,但有些情況下,您希望該屬性在每次調用時都返回不同的值。 –
就是這樣!謝謝 :) – Jihel
聽起來像是你的財產應該只是一個函數的定義,並在執行對需求的功能:
var foo = {
bar: function() { return goDoSomething(); }
};
foo.bar();
要保存它,也許更多一點 - 填充另一個變量的價值和使用它前進一旦它在那裏。
var foo = new function() {
var _bar;
this.bar = function() {
if (!_bar) {
_bar = goDoSomething();
}
return _bar;
}
}();
function goDoSomething() {
console.log("goDoSomething();");
return 4;
}
應該是': ''而不是'''在'bar'之後,因爲這是對象。 – antyrat
@antyrat謝謝,修正。我現在在C#匿名類型的心態。 –
如果是正是你想做的事,在Firefox/Chrome的所有JavaScript對象/其他一些有__defineGetter__
屬性,你可以用它來定義懶惰計算的值。
> a.__defineGetter__('b', function() {return 'c';})
> a.b
"c"
我想你必須在這裏使用一些getters(/ setter)(可能與緩存) – yent
簡單的答案? nop ...而且我認爲這不是一個很好的實踐來實現這個是你的用例的JS ... – NDM
@NickyDeMaeyer在這個用例中有沒有特別的理由不使用它? – Jihel