我希望能够有一个用setter和getter替换所有对象属性的函数。
function myFunction(obj){
var private={};
for(var i in obj){
if(obj.hasOwnProperty(Ii){
private[i]=obj[i]
delete obj[i]
Object.defineProperty(obj, i, {
set:(function(i){return function(val){private[i]=val}})(i),
set:(function(i){return function(){return private[i]}})(i)
})}
}
return obj
}
这是否有用或者我应该使用不同的方法来迭代对象,这种将数据存储在单独对象中的方式是否也会导致问题。
答案 0 :(得分:1)
将数据存储在单独的对象中很好。
我会使用Object.keys
来简化代码,假设您并不真正想要替换继承的属性(for-in
枚举两者&#34 ;拥有"和继承的属性; Object.keys
只给你一个"拥有"可枚举属性的数组:
function myFunction(obj){
var private = {};
Object.keys(obj).forEach(function(key) {
private[key] = obj[key];
// No need for the `delete`
Object.defineProperty(obj, key, {
set: function(value) {
private[key] = value;
},
get: function() {
return private[key];
},
enumerable: true,
configurable: true // Or leave it off if you don't want the
// property reconfigured
});
});
return obj;
}
注意:
forEach
回调,我们使get
/ set
函数关闭key
,因此可以避免创建临时包装函数。enumerable
默认为false
;我假设您不想更改属性的可枚举性,因此我已添加enumerable: true
set
两次,而不是get
和set