Object.defineProperty

1.基本理解Object.defineProperty

Object.defineProperty()可以給對(duì)象添加新的屬性,也可以修改本身的屬性

1.1簡(jiǎn)單的理解

是利用defineproperty來實(shí)現(xiàn)具體來說是對(duì)data里的屬性都設(shè)置了getter和setter,getter收集依賴就是收集每個(gè)標(biāo)簽和每個(gè)數(shù)據(jù)屬性的對(duì)應(yīng)關(guān)系,當(dāng)data對(duì)象中屬性修改賦值的時(shí)候就會(huì)觸發(fā)對(duì)應(yīng)的setter函數(shù)攔截進(jìn)行視圖更新

1751872982884.png

2.深入理解Object.defineProperty

當(dāng)Object.defineProperty()這個(gè)方法改變自身屬性時(shí),比如給自身name屬性添加get(),和set()方法時(shí),就會(huì)出現(xiàn)錯(cuò)誤,雖然表面上方法添加上了,但實(shí)質(zhì)上是一種錯(cuò)誤的表現(xiàn)形式

let data={
            name:"一元教育"
        }
        //死循環(huán),當(dāng)你讀取data.name時(shí),調(diào)用get(),然后一直讀取,進(jìn)入死循環(huán),當(dāng)你改變data.name值,一直在改變,進(jìn)入新的死循環(huán)
        Object.defineProperty(data,'name',{
            get(){
                return data.name
            },
            set(val){
                data.name=val
            }
        })

3.更深層理解該方法
我們學(xué)Vue的時(shí)候,它里面原生寫數(shù)據(jù)代理就涉及到該方法,具體內(nèi)容,我一 一說開,構(gòu)造一個(gè)名為vm的Vue對(duì)象 ,數(shù)據(jù)代理表面上是指vm._data=data;將data里面的數(shù)據(jù)對(duì)象賦值給新的對(duì)象_data,但_datal里面的內(nèi)容不止如此,里面有g(shù)et(),set(),這個(gè)時(shí)候要寫一段代碼說明用該方法如何使用使得Vue對(duì)象里面檢測(cè)是否添加get()set()方法,遞歸思想,只要data數(shù)據(jù)里面存在對(duì)象,就能給對(duì)象對(duì)應(yīng)的屬性添加這兩種方法,下面的代碼只考慮一層

<script>
        let data={
            realname:"bob",
            id:"001",
            age:28
        }
        //創(chuàng)建一個(gè)監(jiān)視的實(shí)例對(duì)象,用與監(jiān)視data中屬性的變化
        const obs=new Observer(data);
        function Observer(obj){
            const keys=Object.keys(obj);
            keys.forEach((k)=>{
                //給傳過來的實(shí)例對(duì)象data里面的屬性添加getter,setter方法
                Object.defineProperty(this,k,{
                    get(){
                        return obj[k]
                    },
                    set(val){
                        console.log(`${k}被改了,我要解析模板,生成虛擬DOM,忙碌`);
                        obj[k]=val
                    }
                })
            })
        }
        console.log(obs);
        data=obs;
        console.log(data);
        let vm={};
        vm._data= data;
    </script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容