鍍金池/ 問答/HTML/ 使用Object.defineProperty修改對象的set方法的問題

使用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這樣的方式賦值,是不會調(diào)用par的set的,怎么才能在這種賦值方式下,調(diào)用obj身上的set?
回答
編輯回答
你好胸

當然是對 b 的 value 再進行一次 get,set 的設(shè)置了。JS 對象上的方法,都是淺操作。如果 obj.b 的 value 是一個嵌套了好幾十層的對象,難道還會遞歸的進行操作嗎,顯然是很耗費性能,而且你并不一定需要所有的屬性都受觀測。

2017年4月25日 23:07
編輯回答
練命
 Object.defineProperty(obj, key, {
    set : function(newVal) {
        //...doSomething
    }
})

你這里只是定義了 obj 的屬性 a, b 的 setter, obj.b.b1 = 4 是調(diào)用了 obj.b 的屬性 b1 的 setter

2017年8月6日 14:00
編輯回答
朕略傻
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;
2017年7月31日 03:42