2013-12-22 28 views
0

我想在下面的JavaScript中用defineProperty定義動態獲取器函數。爲了實現只讀功能,我想使用defineProperty。這使我能夠在setter函數中拋出Exception。如何在JavaScript中使用defineProperty動態獲取?

但是,吸氣功能將不起作用。我認爲這個getter動態地返回obj的任何屬性。但事實並非如此。它總是返回obj["three"],最後一個屬性。有沒有什麼方法可以使動態getter在JavaScript中返回適當的屬性?

var obj = {"one":1, "two":2, "three":3}; 
var cloned = {}; 

for (var prop in obj) 
{ 
    var getter = makeGetter(prop); 
    Object.defineProperty(cloned, prop, 
    { 
     set: function() 
     { 
      throw new UnableRewriteException('original cannot be rewrite'); 
     }, 
     get: function() 
     { 
      return obj[prop] 
     }, 
     enumerable: true 
    }); 
} 
+0

這再次看起來像經典的閉環問題,請記住'var'將是功能級別而不是塊級別。 –

+0

[Javascript閉合內循環 - 簡單實用示例]的可能重複(http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –

回答

1

由於@ paul-s提到你在循環中有一個閉包問題。一個簡單的修復:

var obj = {"one":1, "two":2, "three":3}; 
var cloned = {}; 

function makeReadOnlyProperty(cloned, obj, prop) { 
    Object.defineProperty(cloned, prop, 
    { 
     set: function() 
     { 
      throw new UnableRewriteException('original cannot be rewrite'); 
     }, 
     get: function() 
     { 
      return obj[prop] 
     }, 
     enumerable: true 
    }); 
} 

for (var prop in obj) 
{ 
    makeReadOnlyProperty(cloned, obj, prop); 
} 
+0

非常感謝。我的問題解決了,我可以深入理解JavaScript的關閉。 :-) –

相關問題