javascript用defineProperty實現(xiàn)簡單的雙向綁定方法
defineProperty
Object提供的方法,用于給對象添加自定義屬性具體用法如下:
const obj = { _value: 1 }; Object.defineProperty(obj, 'value', { get: function() { console.log('get方法執(zhí)行'); return this._value; }, set: function(a) { console.log('set方法執(zhí)行'); this._value = a; } }) obj.value = 3; console.log(obj.value); console.log(obj._value);
在node中執(zhí)行結(jié)果如下:
下面來分析一下代碼
首先定一個對象,并對對象添加一個自定義屬性value,同時添加了getter,setter兩個函數(shù)用來分別控制value屬性的修改和獲取,
當(dāng)執(zhí)行obj.value = 3;
時,會自動調(diào)屬性的setter方法,將value的修改同步到_value屬性上,當(dāng)執(zhí)行obj.value
語句獲取屬性值時,會自動調(diào)用getter方法獲取方法的返回值;
總結(jié) (參考MDN)
該方法接收三個參數(shù)
obj:要添加屬性的對象
prop: 要定義的屬性
descriptor:要定義或者修改的屬性描述符
其中描述符包含以下幾種
1.configurable:布爾值,控制屬性是否能改變(除了value,writable)及刪除
2.enumerable: 布爾值,控制屬性是否可枚舉,即通過for in循環(huán)或者Object.keys訪問
3.value:屬性值,可以時任何有效JavaScript值
4.writable 布爾值,屬性可否通過賦值修改
5.get:屬性getter函數(shù),執(zhí)行時傳入this,this值取決于調(diào)用者
6.set:屬性setter函數(shù),賦值時執(zhí)行,并傳入this
雙向綁定
由此可以設(shè)計一下數(shù)據(jù)雙向綁定的簡單實現(xiàn):
在數(shù)據(jù)對象內(nèi)定義屬性,通過對dom綁定事件監(jiān)聽dom內(nèi)值的變化,并賦值給數(shù)據(jù)對象,數(shù)據(jù)對象的改動會調(diào)用自身的setter方法,在方法內(nèi)在動態(tài)修改dom內(nèi)容。
代碼如下:
<!-- 簡單數(shù)據(jù)雙向綁定實現(xiàn) --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <div id="root"> <button id='btn'>請求數(shù)據(jù)</button> </div> </body> <script> const root = document.getElementById('root'); const btn = document.getElementById('btn'); const input = document.createElement('input'); const model = document.createElement('p'); const dataModel = { _value:0, } Object.defineProperty(dataModel, 'value', { configurable: true, set:function(value){ this._value = value; input.value = value; model.innerHTML = `<span>數(shù)據(jù)模型:</sapn> ${value}`; }, get:function(){ return this._value; } }) btn.addEventListener('click', () => { const range = Math.floor(Math.random(0, 1) * 100); dataModel.value = range; }) input.addEventListener('input',(ev) => { dataModel.value = ev.target.value; }) const initPage = () => { dataModel.value = 100; } initPage(); root.append(input); root.append(model); </script> </html>
描述有點亂,看實現(xiàn)代碼更清晰一點,有問題歡迎指正
到此這篇關(guān)于javascript用defineProperty實現(xiàn)簡單的雙向綁定方法的文章就介紹到這了,更多相關(guān)javascript defineProperty雙向綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS實現(xiàn)點擊Radio動態(tài)更新table數(shù)據(jù)
這篇文章主要介紹了JS實現(xiàn)點擊Radio動態(tài)更新table數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2017-07-07微信小程序使用slider實現(xiàn)音頻進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了微信小程序使用slider實現(xiàn)音頻進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06uni-file-picker文件選擇上傳功能實現(xiàn)
這篇文章主要介紹了uni-file-picker文件選擇上傳,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07js實現(xiàn)仿Windows風(fēng)格選項卡和按鈕效果實例
這篇文章主要介紹了js實現(xiàn)仿Windows風(fēng)格選項卡和按鈕效果的方法,可實現(xiàn)類似windows選項卡風(fēng)格的tab標(biāo)簽效果,需要的朋友可以參考下2015-05-05優(yōu)化 JavaScript 代碼的方法小結(jié)
客戶端腳本能讓你的應(yīng)用更加地動態(tài)和活躍, 但是瀏覽器對代碼的解析可能造成效率問題, 而這種性能差異在客戶端之間也不盡相同。 這里我們討論和給出一些優(yōu)化你的 JavaScript 代碼的提示和最佳實踐。2009-07-07