一,基本原理
我們這里使用了對象中的一個特殊屬性:訪問器屬性,這個屬性不能在對象中設置,而是必須通過defineProperty()方法單獨定義。
我們首先定義一個函數:
var obj = { };
其次,為obj對象定義一個test的訪問器屬性:
Object.defineProperty(obj, 'test', {
get: ()=>{console.log('get被調用了')},
set: ()=>{console.log('set被調用了')}
})
可以像普通屬性一樣讀取訪問器屬性,但是當讀取或設置訪問器屬性的時候,調用其內部特性:get和set函數。get和set方法內部的this都指向obj,這意味着get和set可以操作對象內部的值。另外訪問器屬性會被優先調用,與其同名的普通屬性則會被忽略。
obj.test //讀取屬性,調用get函數
obj.test = 'abcd' //為屬性賦值,調用set函數
二,舉個栗子
我們要的效果是:隨着輸入框文字的變化,span中會同步顯示相同的文字內容;或者在js或控制台修改obj.test的值,視圖也會更新,這樣就實現了model到view以及view到model的雙向數據綁定。
首先有一個input和span。
<input type="text" id="input_1"> <span id="span_1"></span>
var obj = {};
Object.defineProperty(obj, 'test', {
set: (newVal)=>{
document.getElementById('input_1').value = newVal;
document.getElementById('span_1').innerHTML = newVal;
}
});
document.addEventListener('keyup', (e)=>{
obj.test = e.target.value;
})
效果圖: