遍历对象并用 setter 和 getter 替换属性
Iterate over an object and replace properties with setters and getters
我希望能够有一个函数将所有对象属性替换为 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
}
这行得通还是我应该使用不同的方法来遍历对象,这种将数据存储在单独对象中的方式是否也会导致问题。
将数据存储在单独的对象中没问题。
我会通过使用 Object.keys
来简化代码,假设 你并不是真的想要替换继承的属性(for-in
枚举了两者"own" 和继承的属性;Object.keys
只是给你一个 "own" 可枚举属性的数组):
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
我希望能够有一个函数将所有对象属性替换为 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
}
这行得通还是我应该使用不同的方法来遍历对象,这种将数据存储在单独对象中的方式是否也会导致问题。
将数据存储在单独的对象中没问题。
我会通过使用 Object.keys
来简化代码,假设 你并不是真的想要替换继承的属性(for-in
枚举了两者"own" 和继承的属性;Object.keys
只是给你一个 "own" 可枚举属性的数组):
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