2013-08-01 69 views
1

我試圖做類似延遲加載參數值

var foo = { 
    bar: '' // do some magic here 
}; 

,只有當我需要使用的值(後來在頁面上)只是簡單地調用屬性將運行延遲加載,然後回傳值

典型的例子是我有一個restfull API在頁面打開時加載用戶。 進入菜單後,我想訪問與其相關的屬性(另一個對象),但它在另一個API中,我不想在開頭加載所有。

有財產調用的某種類型的監聽器嗎?

+2

我想你必須在這裏使用一些getters(/ setter)(可能與緩存) – yent

+0

簡單的答案? nop ...而且我認爲這不是一個很好的實踐來實現這個是你的用例的JS ... – NDM

+0

@NickyDeMaeyer在這個用例中有沒有特別的理由不使用它? – Jihel

回答

2

使用Object.definePropery動態計算foo.bar。它在all modern browsers工作。

var foo = { }; 
Object.defineProperty(
    foo, 
    "bar", 
    { 
     get: function() { 
      return 'magic return value'; 
     } 
    } 
    ); 

的jsfiddle:http://jsfiddle.net/wFYxb/

+1

您也可以緩存get()中的值,以便僅調用一次api調用。 –

+0

@MukeshSoni肯定,但有些情況下,您希望該屬性在每次調用時都返回不同的值。 –

+0

就是這樣!謝謝 :) – Jihel

1

聽起來像是你的財產應該只是一個函數的定義,並在執行對需求的功能:

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; 
} 
+2

應該是': ''而不是'''在'bar'之後,因爲這是對象。 – antyrat

+0

@antyrat謝謝,修正。我現在在C#匿名類型的心態。 –

1

如果是正是你想做的事,在Firefox/Chrome的所有JavaScript對象/其他一些有__defineGetter__屬性,你可以用它來定義懶惰計算的值。

> a.__defineGetter__('b', function() {return 'c';}) 
> a.b 
"c"