1垃沦、Object.defineProperty();
Object.defineProperty(對(duì)象客给,屬性,描述符/特性); ->?設(shè)置對(duì)象屬性的特性肢簿,默認(rèn)特性為:可讀靶剑、可寫(xiě)、可配置池充、可枚舉桩引; -> ES3/5中該方法只做底層使用,ES6開(kāi)放給開(kāi)發(fā)者使用收夸;
- - - >>> 作用:其是雙向數(shù)據(jù)綁定的核心方法坑匠,主要做數(shù)據(jù)劫持操作(監(jiān)控屬性變化),同時(shí)也是后期ES6中很多語(yǔ)法糖底層實(shí)現(xiàn)的核心方法卧惜;
補(bǔ)充: 日常開(kāi)發(fā)中“對(duì)象屬性特性”的應(yīng)用 -> ES3/5經(jīng)常會(huì)遇到某類現(xiàn)象厘灼,底層實(shí)現(xiàn)便是“對(duì)象屬性特性”的應(yīng)用,例如var/let聲明的變量咽瓷,是不能進(jìn)行刪除的设凹,就是因?yàn)樵搶傩允恰安豢膳渲谩钡模?/p>
for(var prop in Object.prototype){ console.log(prop);};//遍歷不到 ->?其不可枚舉
2、數(shù)據(jù)劫持 ->?巧妙應(yīng)用Object.defineProperty();中的get();set();監(jiān)控對(duì)象屬性的變化茅姜;
(1).VUE雙向數(shù)據(jù)綁定核心功能由 Observer闪朱、Compile、Watcher三部分實(shí)現(xiàn),其中Observer部分功能實(shí)現(xiàn)由Object.defineProperty實(shí)現(xiàn) ->Observer:監(jiān)測(cè)數(shù)據(jù)變化進(jìn)行相應(yīng)回調(diào)(數(shù)據(jù)劫持)奋姿;
(2).數(shù)據(jù)劫持核心便是調(diào)用Object.defineProperty();中的get();set();方法锄开;其只能監(jiān)控"對(duì)象屬性"的改變,監(jiān)控?cái)?shù)組需另行處理胀蛮,而且對(duì)象新增屬性也無(wú)法有效監(jiān)控院刁,因此ES6推出更完善的Proxy代理,Reflect映射粪狼,但其的兼容性不好(新內(nèi)容)退腥,VUE3.0才開(kāi)始使用,3.0之前采取的還是老方法再榄;
3狡刘、Proxy、Reflect:其比“數(shù)據(jù)劫持”更加完善困鸥,可監(jiān)控對(duì)象及數(shù)組的屬性變化嗅蔬,同時(shí)對(duì)象新增屬性也可有效監(jiān)控,但其兼容性不好 -> ES6新增語(yǔ)法疾就,并非語(yǔ)法糖澜术,使用babel工具進(jìn)行語(yǔ)法降級(jí)也不能全部轉(zhuǎn)換為ES5語(yǔ)法,因此其的兼容性不是很好猬腰;