Object.defineOroperty(obj,key,describeObj)
要搞明白數(shù)據(jù)的雙向綁定循签,必須先整明白這個(gè)方法轻掩;好玩得很!(備注:最好看文檔懦底,我這里簡(jiǎn)單的記錄下就行)
第一個(gè)參數(shù)obj是:要定義屬性的對(duì)象唇牧;也就是你需要定義一個(gè)對(duì)象罕扎,用來(lái)裝你要存的數(shù)據(jù),如:var obj = {name:'LANDEN'};
第二個(gè)參數(shù)是屬性的名字丐重,如這里的name;
第三個(gè)是個(gè)描述對(duì)象
{
configurable:false,
enumerable:false,
value:'',
writable:false,
//set:function(){},
//get:function(){}
}
// 備注:這個(gè)其實(shí)文檔上也有腔召,寫這個(gè)的目的是提醒下,set和get方法不能與value或者writale共存扮惦;只可配置其中一種臀蛛;其他的就不解釋了,看文檔崖蜜;
好了浊仆,那么這個(gè)方法有什么用呢,這個(gè)方法就是實(shí)現(xiàn)數(shù)據(jù)雙向綁定的關(guān)鍵方法豫领;因?yàn)槟鉶bj對(duì)象的所有屬性的改動(dòng)都會(huì)觸發(fā)他的set方法抡柿;
說道這里你如果會(huì)Vue就會(huì)發(fā)現(xiàn),Vue里的所有數(shù)據(jù)都是在data對(duì)象里等恐,而vue用這個(gè)方法觀察著data的變化洲劣,變動(dòng)了就順便更改對(duì)應(yīng)節(jié)點(diǎn)的數(shù)據(jù);(提醒:一個(gè)觀察者只能觀察同一個(gè)對(duì)象的變化课蔬,如上你觀察的obj囱稽,就只能做obj數(shù)據(jù)的雙向綁定,而不是obj2等)
好了二跋,基本介紹就這樣战惊;
上最簡(jiǎn)單實(shí)現(xiàn)一個(gè)數(shù)據(jù)雙向綁定的demo
// html代碼
<input type="text" value="" id="valID">
<p id="textID"></p>
// js 代碼
var obj = {name:'模擬初始化的數(shù)據(jù)'}
testID.value = obj.name;
textID.innerText=obj.name;
// 定義觀察者
Object.defineProperty(obj,name,{
enumerable:true,
configurable:true,
set:function(newVal){
testID.value = newVal;
textID.innerText=newVal;
return newVal;
}
})
// 模擬數(shù)據(jù)改變從而dom上對(duì)應(yīng)數(shù)據(jù)也變化
setTimeout(function(){
obj.name="接收到新數(shù)據(jù)了"
},2000)
// 監(jiān)聽輸入框改變值,對(duì)應(yīng)的數(shù)據(jù)也跟著變化扎即,可以觀察p標(biāo)簽的內(nèi)容看是否跟著輸入框改變样傍,這模擬dom上改變,對(duì)應(yīng)的數(shù)據(jù)也改變
function datachange(){
obj.name=testID.value;
}
// 這樣兩個(gè)方向的數(shù)據(jù)都可以實(shí)現(xiàn)互相綁定了
以上只是模擬了一個(gè)最簡(jiǎn)單的數(shù)據(jù)雙向綁定铺遂;現(xiàn)在你可以自己封裝自己方法來(lái)實(shí)現(xiàn)非框架環(huán)境下的數(shù)據(jù)的雙向綁定了;面試叫你徒手?jǐn)]一個(gè)數(shù)據(jù)雙向綁定的代碼也不用怕了茎刚,so easy!