JavaScript - Proxy

Proxy 是代理的意思.

代理什么?

據(jù)我自己的簡(jiǎn)單測(cè)試,它代理了對(duì)象的 set & get 方法.

JavaScript作為一門編程語(yǔ)法,對(duì)屬性(或者說(shuō)是字段)沒(méi)有提供原生的 setter & getter 函數(shù).這些功能在其他的,類似于 Java,.Net,Objective-C里都有提供.

所以,proxy 更像是 JavaScript 提供的一個(gè)統(tǒng)一的屬性的getter & setter 的監(jiān)測(cè)接口.


Proxy 簡(jiǎn)單語(yǔ)法

Proxy 是一個(gè)構(gòu)造函數(shù),在調(diào)用的時(shí)候,將需要監(jiān)控的對(duì)象以及 監(jiān)控到了對(duì)象set|get 操作時(shí)該如何去做.

let obj = {
  id: 1,
  level:10,
  name: '李四'
}

現(xiàn)在有一個(gè)需求,如果 level = 10 ,需要在名字加上 vip 標(biāo)記.

那我們就不能直接輸出 obj.name 了,起碼要判斷一下,level === 10 ?

通常做法,我們是寫了一個(gè) hasVip() 的方法.

hasVip() {
    if (this.level === 10) {
      return this.name + ' vip'
    }
  }

使用 proxy.

let objProxy = new Proxy(obj, {
  get(obj, prop) {
    if (prop === 'name') {
      return obj.level === 10 ? obj.name + ' vip' : obj.name
    }
  }
})

利用一個(gè)Proxy 構(gòu)造函數(shù)把需要代理的 get & set 的對(duì)象包裝起來(lái).

然后我們?cè)谑褂么舜韺?duì)象 objProxy.name 直接輸出name 屬性即可.

console.log(objProxy.name)
李四 vip

當(dāng)然,set方法也是一樣,在設(shè)置屬性set的時(shí)候,也可以監(jiān)控.

// 第一個(gè)參數(shù),被代理的對(duì)象
  // 第二個(gè)參數(shù),set監(jiān)控到的屬性
  // 第三個(gè)參數(shù),set的值.
  set(obj, prop,value) {
    if (prop === 'id') {
      if (!Number.isNaN(value)) {
        console.log(`${prop} = ${value} 必須是數(shù)字!!!!`)
        return
      }
      
      obj.id = parseInt(value)
      console.log(obj.id)
    }
  }
objProxy.id = 'avcde'
id = avcde 必須是數(shù)字!!!!

總結(jié):

  • 原生的js對(duì)象屬性,我們可以很輕松,甚至是無(wú)意識(shí)的寫 obj.name='xxxx' & let b = obj.name.這樣類似于其他語(yǔ)言中可以叫 getter & setter 的方法.
  • js之前本身沒(méi)有提供一個(gè)比較好的 getter & setter 機(jī)制.
  • 利用js新提供的 Proxy 構(gòu)造函數(shù)可以為一個(gè)對(duì)象在全局上提供一個(gè) get&set,用于監(jiān)控此對(duì)象身上所有的 屬性取值和賦值操作.
  • 加了一層監(jiān)控之后,我們就可以根據(jù)自己的需求來(lái)做一些必要的事情了.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,674評(píng)論 1 32
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,446評(píng)論 6 13
  • eeprom:電修改程序,地址線既所有的地址個(gè)數(shù)有2的多少次方。數(shù)據(jù)線既每個(gè)寄存器有多少位。
    王子龍同學(xué)閱讀 543評(píng)論 0 50
  • 版權(quán)歸作者所有,任何形式轉(zhuǎn)載請(qǐng)聯(lián)系作者。 作者:無(wú)微不智(來(lái)自豆瓣) 來(lái)源:https://www.douban....
    無(wú)微不智A閱讀 606評(píng)論 0 0
  • 定義:新生兒在開奶后出現(xiàn)的胃潴留、嘔吐、返流、腹脹等現(xiàn)象,稱為喂養(yǎng)不耐受。其中早產(chǎn)兒由于胃腸消化吸收功能不...
    陳冰瑩閱讀 6,676評(píng)論 0 0

友情鏈接更多精彩內(nèi)容