遍历对象并用 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,而不是 getset