使用Object.defineProperty修改对象的set方法的问题

比如一个对象:
obj:{
    a : 1,
    b : {
        b1 : 2,
        b2 : 3
    }
}

 Object.keys(obj).forEach(function(key){
        Object.defineProperty(obj, key, {
            set : function(newVal) {
                //...doSomething
            }
        })
    })
我试了一下,如果是使用obj.b.b1 = 4这样的方式赋值,是不会调用par的set的,怎么才能在这种赋值方式下,调用obj身上的set?
阅读 4.5k
3 个回答
var obj={
    a : 1,
    b : {
        b1 : 2,
        b2 : 3
    }
}

function aaa(obj){
    Object.keys(obj).forEach(function(key){ 
         if(typeof obj[key]=='object'){
             return aaa(obj[key]);
        }
        Object.defineProperty(obj, key, {
            set : function(newVal) {
               console.log(newVal)
            }
        })           
    })
}
aaa(obj)
    obj.b.b2=3;
新手上路,请多包涵
 Object.defineProperty(obj, key, {
    set : function(newVal) {
        //...doSomething
    }
})

你这里只是定义了 obj 的属性 a, b 的 setter, obj.b.b1 = 4 是调用了 obj.b 的属性 b1 的 setter

当然是对 b 的 value 再进行一次 get,set 的设置了。JS 对象上的方法,都是浅操作。如果 obj.b 的 value 是一个嵌套了好几十层的对象,难道还会递归的进行操作吗,显然是很耗费性能,而且你并不一定需要所有的属性都受观测。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题