最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

談?wù)勔騐ue.js引發(fā)關(guān)于getter和setter的思考

 更新時間:2016年12月02日 09:04:31   投稿:daisy  
最近因為公司的新項目決定使用Vue.js來做,但在使用的過程中發(fā)現(xiàn)了一個有趣的事情,因為發(fā)現(xiàn)的這個事情展開了一些對于getter和setter的思考,具體是什么下面通過這篇文章來一起看看吧,有需要的朋友們可以參考學(xué)習(xí)。

起因

當我打印出Vue實例下的data對象里的屬性時,發(fā)現(xiàn)了一個有趣的事情:

它的每個屬性都有兩個相對應(yīng)的getset方法,我覺的這是多此一舉的,于是去網(wǎng)上查了查Vue雙向綁定的實現(xiàn)原理,才發(fā)現(xiàn)它和Angular.js雙向綁定的實現(xiàn)原理完全不同,Angular是用的數(shù)據(jù)臟檢測,當Model發(fā)生變化,會檢測所有視圖是否綁定了相關(guān)數(shù)據(jù),再更改視圖。而Vue使用的發(fā)布訂閱模式,是點對點的綁定數(shù)據(jù)。

Vue的數(shù)據(jù)綁定只有兩個步驟,compile=>link。

我一直在想,vue是通過什么去監(jiān)聽用戶對Model的修改,直到我發(fā)現(xiàn)Vue的data里,每個屬性都有setget屬性,我才明白過來。

在平時,我們創(chuàng)建一個對象,并修改它的屬性,是這樣的:

 var obj = {
  val:99
 }
 obj.val = 100;
 console.log(obj.val)//100

沒有任何問題,但是如果要你去監(jiān)測,當我修改了這個對象的屬性時,要去做一些事,你會怎么做?

相關(guān)思考

這就要用到gettersetter了。

假設(shè)我現(xiàn)在要給一個碼農(nóng)對象添加一個name屬性,而且每次更新name屬性時,我要去完成一些事,我們可以這樣做:

 var Coder = function() {
  var that = this;
  return {
   get name(){
    if(that.name){
     return that.name
    }
    return '你還沒有取名'
   },
   set name(val){
    console.log('你把名字修成了'+val)
    that.name = val
   }
  }
 }
 var isMe = new Coder()
 console.log(isMe.name)
 isMe.name = '周神'
 console.log(isMe.name)
 console.log(isMe)

輸出:

你會發(fā)現(xiàn)這個對象和最上面的Vue中的data對象,打印出來的效果是一樣的,都擁有getset屬性。

我們來一步步分析下上面的代碼,很有趣。

我們先創(chuàng)建一個對象字面量:

var Coder = function() {...}

再把this緩存一下:

var that = this;

接下來是最重要的,我們return了一個對象回去:

{

  get name(){...},

  set name(val){...}

}

顧名思義,get為取值,set為賦值,正常情況下,我們?nèi)≈岛唾x值是用obj.prop的方式,但是這樣做有一個問題,我如何知道對象的值改變了?所以就輪到set登場了。

你可以把getset理解為function,當然,只是可以這么理解,這是完全不一樣的兩個東西。

接下來創(chuàng)建一個碼農(nóng)的實例,isMe;此時,isMe是沒有name屬性的,當我們調(diào)用isMe.name時,我們會進入到get name(){...}中,先判斷isMe是否有name屬性,答案是否定的,那麼就添加一個name屬性,并給它賦值:"你還沒有取名";如果有name屬性,那就返回name屬性。

看到這里你一定知道get怎么使用了,對,你可以把get看成一個取值的函數(shù),函數(shù)的返回值就是它拿到的值。

我感覺比較重要的是set屬性,當我給實例賦值:

isMe.name="周神"

此時,會進入set name(val){...};形參val就是我賦給name屬性的值,在這個函數(shù)里,我就可以做很多事了,比如雙向綁定!因為這個值的每次改變都必須經(jīng)過set,其他方式是改變不了它的,相當于一個萬能的監(jiān)聽器。

還有另一種方法可以實現(xiàn)這個功能。

ES5的對象原型有兩個新的屬性__defineGetter____defineSetter__ ,專門用來給對象綁定get和set。

可以這樣書寫:

 var Coder = function() {
 }
 Coder.prototype.__defineGetter__('name', function() {
  if (this.name) {
   return this.name
  }else{
   return '你還沒有取名'
  }
 })
 Coder.prototype.__defineSetter__('name', function(val) {
  this.name = val
 })
 var isMe = new Coder()
 console.log(isMe.name)
 isMe.name = '周神'
 console.log(isMe.name)
 console.log(isMe)

效果是一樣的,建議使用下面這種方式,因為是在原型上書寫,所以可以繼承和重用。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • 基于Vue構(gòu)建簡單的Markdown編輯器

    基于Vue構(gòu)建簡單的Markdown編輯器

    在現(xiàn)代前端開發(fā)中,Markdown作為一種輕量級的文本標記語言,越來越受到開發(fā)者和內(nèi)容創(chuàng)作者的青睞,本文我們就來使用Vue.js構(gòu)建一個簡單的Markdown編輯器吧
    2025-02-02
  • vue實現(xiàn)把接口單獨存放在一個文件方式

    vue實現(xiàn)把接口單獨存放在一個文件方式

    這篇文章主要介紹了vue實現(xiàn)把接口單獨存放在一個文件方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue router重定向redirect如何傳值問題

    Vue router重定向redirect如何傳值問題

    這篇文章主要介紹了Vue router重定向redirect如何傳值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vuex命名空間的使用

    vuex命名空間的使用

    本文主要介紹了vuex命名空間的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 簡單了解vue 插值表達式Mustache

    簡單了解vue 插值表達式Mustache

    這篇文章主要介紹了vue 插值表達式Mustache的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Vue業(yè)務(wù)組件封裝Table表格示例詳解

    Vue業(yè)務(wù)組件封裝Table表格示例詳解

    這篇文章主要為大家介紹了Vue業(yè)務(wù)組件封裝Table表格示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • vue實現(xiàn)的網(wǎng)易云音樂在線播放和下載功能案例

    vue實現(xiàn)的網(wǎng)易云音樂在線播放和下載功能案例

    這篇文章主要介紹了vue實現(xiàn)的網(wǎng)易云音樂在線播放和下載功能,結(jié)合具體實例形式分析了網(wǎng)易云音樂相關(guān)接口調(diào)用與操作技巧,需要的朋友可以參考下
    2019-02-02
  • vue同一個瀏覽器登錄不同賬號數(shù)據(jù)覆蓋問題解決方案

    vue同一個瀏覽器登錄不同賬號數(shù)據(jù)覆蓋問題解決方案

    同一個瀏覽器登錄不同賬號session一致,這就導(dǎo)致后面登錄的用戶數(shù)據(jù)會把前面登錄的用戶數(shù)據(jù)覆蓋掉,這個問題很常見,當前我這邊解決的就是同一個瀏覽器不同窗口只能登錄一個用戶,對vue同一個瀏覽器登錄不同賬號數(shù)據(jù)覆蓋問題解決方法感興趣的朋友一起看看吧
    2024-01-01
  • vue瀏覽器返回監(jiān)聽的具體步驟

    vue瀏覽器返回監(jiān)聽的具體步驟

    這篇文章主要給大家介紹了關(guān)于vue瀏覽器返回監(jiān)聽的具體步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • vue父子組件進行通信方式原來是這樣的

    vue父子組件進行通信方式原來是這樣的

    這篇文章主要為大家詳細介紹了vue父子組件進行通信方式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02

最新評論

双峰县| 彭阳县| 麻江县| 武安市| 固始县| 华亭县| 兰西县| 南部县| 西贡区| 永年县| 海安县| 南阳市| 东莞市| 绵竹市| 昭觉县| 子长县| 昌平区| 南宫市| 鹿泉市| 顺平县| 孟连| 新平| 银川市| 措勤县| 哈密市| 名山县| 德庆县| 安宁市| 信阳市| 阿城市| 梅河口市| 遂昌县| 偏关县| 三原县| 渑池县| 库伦旗| 钦州市| 泰顺县| 井陉县| 许昌县| 宝鸡市|