迭代一个对象并用setter和getter替换属性

时间:2017-09-13 13:20:37

标签: javascript iteration getter-setter

我希望能够有一个用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
}

这是否有用或者我应该使用不同的方法来迭代对象,这种将数据存储在单独对象中的方式是否也会导致问题。

1 个答案:

答案 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两次,而不是getset