1. Vue2 響應(yīng)式原理-Object.defineProperty

創(chuàng)建一個(gè)Vue的Class類(lèi)
class Vue {
    constructor(options) {
        this.$options = options;  // 接收實(shí)例化Vue時(shí)的option,綁定到實(shí)例上
        this.data = options.data;  // 將實(shí)例化Vue時(shí)的data綁定到當(dāng)前實(shí)例上
        this.initData();  // 初始化data
    }

    initData() {
        const data = this.data;
        const keys = Object.keys(data); // 取data屬性的所有鍵
        for (let i = 0; i < keys.length; i++) { // 將實(shí)例中的data上的屬性代理到this上
            const key = keys[i];
            Object.defineProperty(this, key, {
                enumerable: true,
                get: function () {
                    return data[key];
                },
                set: function (newVal) {
                    data[key] = newVal;
                }
            })
        }
        // 深度監(jiān)聽(tīng)(判斷data是否是引用類(lèi)型,如果是引用類(lèi)型的數(shù)據(jù)還需要遞歸深層次監(jiān)聽(tīng))
        observe(data); 
    }
}

function observe(data) {
    const type = Object.prototype.toString.call(data);
    // 引用類(lèi)型需深度監(jiān)聽(tīng)
    if (type !== ('[object Object]' || '[object Array]')) { // 如果不是引用類(lèi)型,代表已經(jīng)遍歷到最深層
        return;
    }
    new Observer(data);  // 如果是引用類(lèi)型,則需深層次的遞歸監(jiān)聽(tīng)
}

class Observer { // 創(chuàng)建一個(gè)Observer 實(shí)例,用于深層次監(jiān)聽(tīng)
    constructor(data) {
        this.walk(data);
    }
    walk(data) {
        const keys = Object.keys(data);
        for (let i = 0; i < keys.length; i++) {
            const key = keys[i];
            defineReactive(data, key, data[key]);
        }
    }
}

/*
* @param data 需要監(jiān)聽(tīng)的對(duì)象
* @param key 需要監(jiān)聽(tīng)的對(duì)象的屬性
* @param value 需要監(jiān)聽(tīng)的對(duì)象的屬性值
*/
function defineReactive(data, key, value) {
    observe(data[key]);
    let val = value;
    Object.defineProperty(data, key, {
        enumerable: true,
        get: function () {
            return val;
        },
        set: function (newVal) {
            if (val === newVal) {
                return;
            }
            val = newVal;
        }
    })
}

watch原理后續(xù)更新

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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