Object.defineProperty(obj,"name",{ set:function(val){ if(var==='lisi'){ console.log("誓死不叫這么土的名字") }else{ objCopy.name = val } }, get:function(){ return objCopy.name.replace(/san/,'先生') } })
這個對每個data中的屬性進行遍歷綁定。
而,
var objCopy = new Proxy(obj,{ get:function(target,key){ if(key=='name'){ return target[key].replace(/san/,'先生'); } }, set:function(target,key,value){ if(key == 'name'){ value=='lisi'?target[key]:target[key] = value; }else{ target[key] = value; } } })
get,set方法的target參數即obj對象,key參數是要操作的屬性,value參數是賦值動作時的值。
此后,可通過objCopy.name的方式訪問obj的name屬性,也可以通過objCopy.name='lisi'的方式設置obj的name屬性,而且不用給每個屬性都設置set,get方法,不會觸發循環調用,很是爽的。
這樣我們通過對objCopy對象的操作就實現了對obj對象的操作,objCopy對象就是obj對象的代理對象。
vue3.0使用了Proxy替換了原先遍歷對象使用Object.defineProperty方法給屬性添加set,get訪問器的笨拙做法。
也就是說不應遍歷了,而是直接監控data對象了。
此后,可通過objCopy.name的方式訪問obj的name屬性,也可以通過objCopy.name='lisi'的方式設置obj的name屬性,而且不用給每個屬性都設置set,get方法,不會觸發循環調用,很是爽的。
這樣我們通過對objCopy對象的操作就實現了對obj對象的操作,objCopy對象就是obj對象的代理對象。
vue3.0使用了Proxy替換了原先遍歷對象使用Object.defineProperty方法給屬性添加set,get訪問器的笨拙做法。