Vue響應(yīng)式原理之——Object.defineProperty

先了解一下Object.defineProperty()這個方法:

這個方法主要是用

直接在一個對象上定義一個新屬性,或者修改一個對象的現(xiàn)有屬性, 并返回這個對象。
先寫一個demo

    let person = {
        _data: {
            name: 'wcx',
            age: 122
        }
    }
    Object.defineProperty(person, 'name', {
        get() {
            console.log(`name被獲取了`);
            console.log(person);
            return person._data.name
        },
        set(value) {
            console.log(`name的值被修改了`)
            person._data.name = value;
            console.log(person);
        }
    })

這段代碼可以直接寫在HTML的<script>標(biāo)簽里,然后用瀏覽器運(yùn)行這個HTML。接著,你可以打開F12控制臺,在控制臺里輸入person['name']和 person['name']=‘wry’

圖1.1

可以看到,Object.defineProperty可以監(jiān)聽到屬性被獲取和修改,這也就意味著你能做很多“數(shù)據(jù)驅(qū)動的事”,比如說雙向綁定

什么是雙向綁定?

單向綁定就是把Model綁定到View,當(dāng)我們用JavaScript代碼更新Model時,View就會自動更新。
而雙向綁定就是如果用戶更新了View,Model的數(shù)據(jù)也自動被更新了,這種情況就是雙向綁定。

下面我們就實(shí)現(xiàn)下雙向綁定:

<body>
    <form action="" class="form">
        <p>name: <input type="text" name="name"></p>
        <p>age: <input type="text" name="age"></p>
        <p>name_result: <input type="text" class="name"></p>
        <p>age_result: <input type="text" class="age"></p>
    </form>
<script>
    let person = {
        _data: {
            name: 'wcx',
            age: 13
        }
    }
    Object.defineProperty(person, 'name', {
        get() {
            console.log(`name被獲取了`);
            console.log(person);
            return person._data.name
        },
        set(value) {
            console.log(`name的值被修改了`)
            person._data.name = value;
            console.log(person);            
        }
    })
    Object.defineProperty(person, 'age', {
        get() {
            console.log(`age被獲取了`);
            console.log(person);
            return person._data.age
        },
        set(value) {
            console.log(`age的值被修改了`)
            person._data.age = value;
            console.log(person);            
        }
    })
    let form = document.querySelector('.form');
    form.addEventListener('input', (e) => {
        let _value = e.target.value;
        let nameDom = document.querySelector('.name');
        nameDom.value = _value;
        person['name'] = _value;
        console.log('person', person)
    })
</script>
</body>
image.png

可以看到在name輸入框輸入的值會影響到person里name的值,這樣雙向綁定就實(shí)現(xiàn)了。name_result主要是為了更方便的展示結(jié)果,不寫也沒關(guān)系。

(完)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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