在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ 使用Object.defineProperty修改對(duì)象的set方法的問(wèn)題

使用Object.defineProperty修改對(duì)象的set方法的問(wèn)題

比如一個(gè)對(duì)象:
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這樣的方式賦值,是不會(huì)調(diào)用par的set的,怎么才能在這種賦值方式下,調(diào)用obj身上的set?
回答
編輯回答
你好胸

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

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