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)文章
關(guān)于Javascript與iframe的那些事兒
iframe 很多網(wǎng)站都在用,雖然方便開發(fā)與維護(hù)(可能同時有幾個頁面調(diào)用同一個 iframe ),不過卻存在安全問題2013-07-07
javascript實現(xiàn)表單提交后,提交按鈕不可用的方法
這篇文章主要介紹了javascript實現(xiàn)表單提交后,提交按鈕不可用的方法,涉及javascript動態(tài)修改表單樣式的技巧,非常簡單實用,需要的朋友可以參考下2015-04-04
JS中注入eval, Function等系統(tǒng)函數(shù)截獲動態(tài)代碼
這篇文章主要介紹了JS中注入eval, Function等系統(tǒng)函數(shù)截獲動態(tài)代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04
js實現(xiàn)無感刷新的實踐(附前后端實現(xiàn))
無感刷新機制的目的是在用戶不知情的情況下,自動更新其認(rèn)證令牌本文,主要介紹了js實現(xiàn)無感刷新的實踐(附前后端實現(xiàn)),具有一定的參考價值,感興趣的可以了解一下2024-04-04
JavaScript File API實現(xiàn)文件上傳預(yù)覽
這篇文章主要為大家介紹了JavaScript File API實現(xiàn)文件上傳預(yù)覽,F(xiàn)ile API將極大地方便 Web 端的文件上傳等操作,本文將介紹 File API的概況,并用兩個實例展示File API的應(yīng)用,感興趣的小伙伴們可以參考一下2016-02-02
JS實現(xiàn)雙擊內(nèi)容變?yōu)榭删庉嫚顟B(tài)
在一些網(wǎng)站上我們經(jīng)??吹浇换バ院軓姷墓δ?。一些用戶資料可以直接雙擊出現(xiàn)文本框,并在此輸入新的資料即可修改,無需再按確定按鈕等。怎么實現(xiàn)的呢?今天小編給大家分享JS實現(xiàn)雙擊內(nèi)容變?yōu)榭删庉嫚顟B(tài),需要的的朋友參考下2017-03-03

