淺談vue中數(shù)據(jù)雙向綁定的實現(xiàn)原理
vue中最常見的屬v-model這個數(shù)據(jù)雙向綁定了,很好奇它是如何實現(xiàn)的呢?嘗試著用原生的JS去實現(xiàn)一下。
首先大致學習了解下Object.defineProperty()這個東東吧!
* Object.defineProperty() * 對對象的屬性進行 定義/修改 * */ let obj = {x:10} // 這兩種方式都相對來說比較簡單,直接,但是有些時候我們需要對對象的屬性的修改和增加進行必要的干預 // obj.y = 20; // obj.x = 100; // obj.x = 'abc'; // // let arr = [1,2,3]; // arr.length = 'abc';//不可更改 // console.log(arr); // console.log(obj.x); // delete obj.x; // console.log(obj); Object.defineProperty(obj, 'y', { configurable: false, //設置是否可刪除 false為不可刪除 value: 100 }); console.log(obj); delete obj.y;//刪除 console.log(obj); //設置對象某個屬性值的時候,順便設置它的屬性。enumerable 可枚舉 configurable 可以刪除否 writable 可改值否 Object.defineProperty(obj, 'z', {//enumerable 可枚舉(沒有則新添加) enumerable: true,//為false時,for..in object.keys json.stringfy 不能取到該z屬性 value: 10000 }); for (var attr in obj) { console.log(attr); } Object.defineProperty(obj, 'm', { writable: false,//可更改 value: 9 }); console.log(obj); obj.m = 100; console.log(obj);
以上總結(jié)了對象的defineProperty四個屬性:configurable,enumerable,value,writable
接下來再深入認識下它的另外兩個方法:set 以及get
注意:get和set不能與configurable,enumerable,value,writable同時存在
let obj = {x:10} let y = 100; Object.defineProperty(obj, 'y', { get() { //當obj的y屬性被調(diào)用的時候觸發(fā),該方法的返回值將作為獲取的結(jié)果 console.log('get'); return y; }, set(value) { //當obj的y屬性被設置的時候觸發(fā) console.log('set', value); y = value; } }) console.log(obj.y); obj.y = 1; console.log(obj.y);
介紹完defineProperty了,最后我們一起看看如何簡單的實現(xiàn)數(shù)據(jù)雙向綁定吧!
<body> <input type="text" id="age"> <h1></h1> <script> var ageElement = document.querySelector('#age'); var h1Element = document.querySelector('h1'); let obj = {}; Object.defineProperty(obj, 'age', { get() { }, set(value) { ageElement.value = value; h1Element.innerHTML = value; } }) obj.age = 10; ageElement.oninput = function() { obj.age = this.value; } </script>
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
mockjs+vue頁面直接展示數(shù)據(jù)的方法
這篇文章主要介紹了mockjs+vue頁面直接展示數(shù)據(jù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12Vue集成three.js并加載glb、gltf、FBX、json模型的場景分析
這篇文章主要介紹了Vue集成three.js,并加載glb、gltf、FBX、json模型,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09vue項目使用node連接數(shù)據(jù)庫的方法(前后端分離)
這篇文章主要介紹了vue項目使用node連接數(shù)據(jù)庫(前后端分離),本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12vue+element項目中過濾輸入框特殊字符小結(jié)
這篇文章主要介紹了vue+element項目中過濾輸入框特殊字符小結(jié),本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08vue前端項目打包成Docker鏡像并運行的實現(xiàn)
這篇文章主要介紹了vue前端項目打包成Docker鏡像并運行的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08