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

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

這個(gè)方法主要是用

直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性, 并返回這個(gè)對(duì)象。
先寫(xiě)一個(gè)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);
        }
    })

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

圖1.1

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

什么是雙向綁定?

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

下面我們就實(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輸入框輸入的值會(huì)影響到person里name的值,這樣雙向綁定就實(shí)現(xiàn)了。name_result主要是為了更方便的展示結(jié)果,不寫(xiě)也沒(méi)關(guān)系。

(完)

?著作權(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)容

  • 一、概述 每當(dāng)被問(wèn)到Vue數(shù)據(jù)雙向綁定原理的時(shí)候,大家可能都會(huì)脫口而出:Vue內(nèi)部通過(guò)Object.defineP...
    我可是果果閱讀 1,725評(píng)論 0 2
  • 下面這段話:Vue3.0版本中將基于Proxy來(lái)改造觀察者模式。說(shuō)明Vue3.0講不再借助于ES5的Object....
    Jonath閱讀 678評(píng)論 0 1
  • 幾種雙向綁定的做法目前幾種主流的mvc(vm)框架都實(shí)現(xiàn)了單向數(shù)據(jù)綁定,我認(rèn)為的雙向數(shù)據(jù)綁定其實(shí)就是在單向綁定的基...
    Picidae閱讀 5,704評(píng)論 2 4
  • 本文目錄 1.簡(jiǎn)述Vue的響應(yīng)式原理 2.delete和Vue.delete刪除數(shù)組的區(qū)別 3.v-for循環(huán)時(shí)為...
    前端輝羽閱讀 1,033評(píng)論 0 12
  • 作為產(chǎn)品開(kāi)發(fā)者或設(shè)計(jì)者,要深諳一點(diǎn):即我們關(guān)注最終結(jié)果的擁有者,只是間接地關(guān)注用戶。但是在免費(fèi)時(shí)代,很多公司并不靠...
    4c786f652758閱讀 283評(píng)論 0 0

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