2010-03-12 76 views
1
var author = { 
firstname: 'Martin', 
lastname: 'Hansen' 
} 

function settersGetters(propStr) { 
for (var i = 0; i < propStr.length; i++) { 

    author['_'+ propStr[i]] = null; 

    author.__defineGetter__(propStr[i], 
    function() { 
     return author['_'+ propStr[i]]; 
    }); 

    author.__defineSetter__(propStr[i], 
    function(val) { 
     author['_'+ propStr[i]] = val; 
    }); 
}; 
} 

上面的代碼會希望爲對象作者提供的任何屬性(在數組中)生成setter/getters。Javascript setter/getters

但是當我調用下面的代碼名字和姓氏都是奧爾森..我做錯了什麼?

settersGetters(['firstname', 'lastname']); 
author.firstname = 'per'; 
author.lastname = 'olsen'; 

console.log(author.firstname); 
console.log(author.lastname); 

回答

1

該定義是在閉包中進行的,所以所有的setter都使用了i的最後一個值。

使用這個代替:

function setterGetter(property) 
{ 
    author['_'+ property] = null; 

    author.__defineGetter__(property, 
    function() { 
     return author['_'+ property]; 
    }); 

    author.__defineSetter__(property, 
    function(val) { 
     author['_'+ property] = val; 
    }); 
} 
function settersGetters(propStr) { 
for (var i = 0; i < propStr.length; i++) { 
     setterGetter(propStr[i]); 
}; 
} 
+0

謝謝,解決了它。 – 2010-03-12 15:28:14

2

我懷疑這是一個閉合的問題,這幾個有用的人對我here解釋。

嘗試在函數中包裝i引用,並閱讀關閉。儘管有所幫助,但我承認我仍然不太瞭解他們。

+1

這的確是,當產生的函數被調用,他們永遠有最高的'i'值。更多:http://blog.niftysnippets.org/2008/02/closures-are-not-complicated.html – 2010-03-12 14:12:21