屬性攔截器(Object.defineProperty),以及VUE中的雙向數(shù)據(jù)綁定簡(jiǎn)單實(shí)現(xiàn)

vue.js是通過(guò)它實(shí)現(xiàn)雙向綁定的储藐。俗稱(chēng)屬性攔截器或者前端數(shù)據(jù)劫持。

首先看一下官方的定義:

一嘶是、Object.defineProperty()
方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性钙勃,或者修改一個(gè)已經(jīng)存在的屬性, 并返回這個(gè)對(duì)象聂喇。

語(yǔ)法:
Object.defineProperty(obj,prop,descriptor)

參數(shù):
1.obj:需要定義屬性的對(duì)象辖源。

2.prop:需定義或修改的屬性的名字蔚携。

3.descriptor:將被定義或修改的屬性的描述符。

返回值:

返回傳入函數(shù)的對(duì)象克饶,即第一個(gè)參數(shù)obj酝蜒。
對(duì)象里目前存在的屬性描述符有兩種主要形式:數(shù)據(jù)描述符和存取描述符。數(shù)據(jù)描述符是一個(gè)擁有可寫(xiě)或不可寫(xiě)值的屬性矾湃。存取描述符是由一對(duì) getter-setter 函數(shù)功能來(lái)描述的屬性亡脑。描述符必須是兩種形式之一;不能同時(shí)是兩者邀跃。

數(shù)據(jù)描述符和存取描述符均具有以下可選鍵值:

configurable
當(dāng)且僅當(dāng)該屬性的 configurable 為 true 時(shí)霉咨,該屬性描述符才能夠被改變,也能夠被刪除拍屑。默認(rèn)為 false途戒。

enumerable
當(dāng)且僅當(dāng)該屬性的 enumerable 為 true 時(shí),該屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中僵驰。默認(rèn)為 false喷斋。

數(shù)據(jù)描述符同時(shí)具有以下可選鍵值:

value
該屬性對(duì)應(yīng)的值∷廛睿可以是任何有效的 JavaScript 值(數(shù)值星爪,對(duì)象,函數(shù)等)粉私。默認(rèn)為 undefined移必。

writable
當(dāng)且僅當(dāng)該屬性的 writable 為 true 時(shí),該屬性才能被賦值運(yùn)算符改變毡鉴。默認(rèn)為 false。

存取描述符(第三個(gè)參數(shù)對(duì)象)同時(shí)具有以下可選鍵值:

get
一個(gè)給屬性提供 getter 的方法秒赤,如果沒(méi)有 getter 則為undefined猪瞬。當(dāng)我們讀取某個(gè)屬性的時(shí)候,其實(shí)是在對(duì)象內(nèi)部調(diào)用了該方法入篮,此方法必須要有return語(yǔ)句陈瘦。該方法返回值被用作屬性值。默認(rèn)為 undefined潮售。

set
一個(gè)給屬性提供 setter 的方法痊项,如果沒(méi)有 setter 則為 undefined。該方法將接受唯一參數(shù)酥诽,并將該參數(shù)的新值分配給該屬性鞍泉。默認(rèn)為 undefined。也就是說(shuō)肮帐,當(dāng)我們?cè)O(shè)置某個(gè)屬性的時(shí)候咖驮,實(shí)際上是在對(duì)象的內(nèi)部調(diào)用了該方法边器。

要注意的一點(diǎn)是:在 descriptor 中不能同時(shí)設(shè)置訪問(wèn)器(get 和 set)和 wriable 或 value,否則會(huì)錯(cuò)托修,就是說(shuō)想用 get 和 set忘巧,就不能用 writable 或 value 中的任何一個(gè)。

寫(xiě)個(gè)小例子:

代碼段:

1.png

視圖顯示:

2.png

1s后的視圖顯示

3.png

2s后的視圖顯示

4.png

說(shuō)這么多睦刃,也就是我們可以在頁(yè)面監(jiān)聽(tīng)某個(gè)變量砚嘴,當(dāng)變量發(fā)生變化的時(shí)候,我們就更新對(duì)應(yīng)的視圖涩拙。由數(shù)據(jù)來(lái)驅(qū)動(dòng)視圖的更新际长,vue .js的核心思想就是這個(gè)。

二吃环、數(shù)據(jù)雙向綁定:

數(shù)據(jù)模型和視圖之間的雙向綁定也颤,用戶在視圖上的修改會(huì)自動(dòng)同步到數(shù)據(jù)模型中,同樣的郁轻,如果數(shù)據(jù)模型中的值發(fā)生變化翅娶,也會(huì)同步到視圖中去。

優(yōu)點(diǎn):雙向綁定在一些需要實(shí)時(shí)反應(yīng)用戶輸入的場(chǎng)合會(huì)非常方便(比如多級(jí)聯(lián)動(dòng)菜單)

最經(jīng)常應(yīng)用的場(chǎng)景:表單

代碼示例:

5.png

視圖顯示:

6.png

注意:
Vue 雖然通過(guò) v-model 支持雙向綁定好唯,但是如果引入了類(lèi)似redux的vuex竭沫,就無(wú)法同時(shí)使用 v-model。
詳情參見(jiàn):https://github.com/vuejs/vuex/blob/master/docs/zh-cn/forms.md

總結(jié):
單向綁定跟雙向綁定在功能上基本上是互補(bǔ)的骑篙,所以我們可以在合適的場(chǎng)景下使用合適的手段蜕提。比如在UI控件中(通常是類(lèi)表單操作),會(huì)使用雙向的方式綁定數(shù)據(jù)靶端;而其他場(chǎng)景則統(tǒng)一采用單向方式構(gòu)建谎势。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市杨名,隨后出現(xiàn)的幾起案子脏榆,更是在濱河造成了極大的恐慌,老刑警劉巖台谍,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件须喂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡趁蕊,警方通過(guò)查閱死者的電腦和手機(jī)坞生,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)掷伙,“玉大人是己,你說(shuō)我怎么就攤上這事∪喂瘢” “怎么了赃泡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵寒波,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我升熊,道長(zhǎng)俄烁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任级野,我火速辦了婚禮页屠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蓖柔。我一直安慰自己辰企,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布况鸣。 她就那樣靜靜地躺著牢贸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镐捧。 梳的紋絲不亂的頭發(fā)上潜索,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音懂酱,去河邊找鬼竹习。 笑死,一個(gè)胖子當(dāng)著我的面吹牛列牺,可吹牛的內(nèi)容都是我干的整陌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瞎领,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泌辫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起九默,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤震放,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后荤西,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伍俘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年邪锌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癌瘾。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡觅丰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妨退,到底是詐尸還是另有隱情妇萄,我是刑警寧澤蜕企,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站冠句,受9級(jí)特大地震影響轻掩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懦底,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一唇牧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧聚唐,春花似錦丐重、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至亲桦,卻和暖如春崖蜜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烙肺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工纳猪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桃笙。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓氏堤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親搏明。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鼠锈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,395評(píng)論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,105評(píng)論 1 32
  • 我是瘋兒 你是傻 纏纏綿綿到天涯 我是蘑菇 你是線 纏纏綿綿成線團(tuán) 我是妹妹 你是姐 嘻嘻哈哈到永遠(yuǎn) ??
    居家小咸魚(yú)閱讀 287評(píng)論 1 1
  • 心法與手法的結(jié)合 生命中有許多事物,都是需要用心靈去體驗(yàn)的星著。頭腦固然可以幫忙购笆,但它絕對(duì)無(wú)法取代心靈的體驗(yàn)。愛(ài)情如是...
    尚先李政濤閱讀 2,905評(píng)論 1 9
  • 我留戀家中可口的飯菜 我留戀家里暖和的被窩 我留戀父母對(duì)我的嘮叨 我留戀村莊清晨和日落 可是我還要遠(yuǎn)方的美好 又一...
    笑逐燕開(kāi)Yeon閱讀 188評(píng)論 0 2