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

ES6之Proxy的get方法詳解

 更新時(shí)間:2019年10月11日 09:38:40   作者:十月七秋  
這篇文章主要介紹了ES6之Proxy的get方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Proxy是在ES2015(ES6)中新添加內(nèi)置對(duì)象,用于自定義一些基本操作。

這篇文章是我在學(xué)習(xí)Proxy的時(shí)候?qū)τ趃et方法的一些心得。

作為ES2015新定義的內(nèi)置對(duì)象,Proxy 能夠攔截并且自定義對(duì)象以及函數(shù)的一些基本操作,具有很高的優(yōu)先級(jí)和便利性,能夠讓我們?cè)趯?xiě)代碼的時(shí)候多出一種解決難題的途徑。

Proxy的get方法用于攔截對(duì)象屬性的讀取操作,例如 obj.key 和 obj.[key]。在給Proxy的handler參數(shù)中設(shè)置get方法后,每當(dāng)進(jìn)行讀取操作時(shí),會(huì)優(yōu)先調(diào)用該get方法,我們可以在這個(gè)方法函數(shù)中對(duì)讀取行為進(jìn)行攔截。請(qǐng)看下面的代碼:

const obj = { key: 1 }
const proxy = new Proxy(obj, {
 get: function(target, property, receiver) {
  console.log('get', property)
  return target[property]
 }
})
console.log(proxy.key)
// get key
// 1

get方法的參數(shù)一共有三個(gè):target是實(shí)例化Proxy時(shí)使用的對(duì)象,在這個(gè)例子中是obj;而property是這次讀取操作中想要獲取的屬性名,在這個(gè)例子中是key;最后一個(gè)參數(shù)receiver則是這個(gè)實(shí)例化的Proxy自身,即proxy。
在這個(gè)例子中,我在get方法的最后返回了target[property],這是為了能夠讓讀取操作能夠進(jìn)行下去。由于Proxy的get方法是最先被調(diào)用的,所以這里返回的內(nèi)容就是我們讀取操作能夠獲得的結(jié)果;如果我們?cè)谶@里不返回任何值,那么就會(huì)得到undefined。

receiver和死循環(huán)

要注意的是,千萬(wàn)不要在get方法中讀取receiver的屬性,因?yàn)閞eceiver實(shí)質(zhì)上就是proxy自身,所以receiver.key這句代碼就等同于proxy.key,會(huì)重新調(diào)用get方法導(dǎo)致死循環(huán)。

const obj = { key: 1 }
const proxy = new Proxy(obj, {
 get: function(target, property, receiver) {
  console.log(receiver.key)
  return target[property]
 }
})
console.log(proxy.key)
// 死循環(huán)!

原型鏈上的getter

有時(shí)候,我們會(huì)在對(duì)象之中使用getter和setter來(lái)定制屬性的賦值和讀取。在這時(shí),如果proxy的get方法內(nèi)部有使用到target[property]的話,target[property]的值會(huì)受到目標(biāo)對(duì)象的getter的影響。因此調(diào)用get方法的時(shí)候請(qǐng)注意在目標(biāo)對(duì)象中是否有用到getter。

const obj = {
 get key() {
  return 'string'
 },
 set key(value) {
  console.log(`key is ${value}, it is a ${typeof value}`)
 }
}
const proxy = new Proxy(obj, {
 get: function(target, property, receiver) {
  if(typeof target[property] !== 'string') {
   return target[property]
  } else {
   throw new TypeError(`The type of ${property} is String!`)
  }
 }
})
proxy.key = 100
console.log(proxy, obj)
// key is 100, it is a number
// The type of key is String!

在上方的例子中,如果訪問(wèn)obj的非數(shù)字類(lèi)型的屬性,就會(huì)拋出一個(gè)錯(cuò)誤,但是由于obj中g(shù)etter的原因,無(wú)論我給key屬性賦什么值,在訪問(wèn)key屬性的時(shí)候肯定會(huì)拋出錯(cuò)誤。

如果僅僅要注意目標(biāo)對(duì)象中的getter還算容易的,但是如果目標(biāo)對(duì)象繼承自其他對(duì)象,那么事情就變得有些麻煩了,請(qǐng)看下面的例子:

const parentObj = {
 get key() {
  return 'string'
 },
 set key(value) {
  console.log(`key is ${value}, it is a ${typeof value}`)
 }
}
const obj = Object.create(parentObj)
const proxy = new Proxy(obj, {
 get: function (target, property, receiver) {
  if (typeof target[property] !== 'string') {
   return target[property]
  } else {
   throw new TypeError(`The type of ${property} is String!`)
  }
 }
})
proxy.key = 100 
console.log(proxy.key)
// key is 100, it is a number
// The type of key is String!

如代碼所示,目標(biāo)對(duì)象obj繼承自parentObj,而parentObj中使用了getter方法,那么使用proxy的get方法仍舊會(huì)報(bào)錯(cuò)。實(shí)際運(yùn)用中原型鏈可能會(huì)很長(zhǎng),getter可能會(huì)存在于原型鏈的任何一個(gè)地方中,所以在使用Proxy的get方法時(shí)請(qǐng)一定要注意。

但是如果把parentObj上的key遮蔽掉,就不會(huì)發(fā)生拋出錯(cuò)誤的情況了。比如在創(chuàng)建obj的時(shí)候申明的key,代碼如下:

const parentObj = {
 get key() {
  return 'string'
 },
 set key(value) {
  console.log(`key is ${value}, it is a ${typeof value}`)
 }
}
const obj = Object.create(parentObj, {
 key: {
  value: null,
  writable: true
 }
})
const proxy = new Proxy(obj, {
 get: function (target, property, receiver) {
  if (typeof target[property] !== 'string') {
   return target[property]
  } else {
   throw new TypeError(`The type of ${property} is String!`)
  }
 }
})
proxy.key = 100 
console.log(proxy.key)
// 100

同樣的,我們也可以使用Object.defineProperty()和Object.assign()這兩個(gè)方法來(lái)達(dá)到相同的目的:

Object.defineProperty(obj, 'key', {
 value: null,
 writable: true
})
obj = Object.assign({}, obj, { key: null })

但是要注意使用Object.assign()的時(shí)候不能這么些:

obj = Object.assign(obj, { key: null })

這樣寫(xiě)法無(wú)法遮蔽掉parentObj上的key屬性,使用的時(shí)候仍舊會(huì)拋出錯(cuò)誤。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 瀏覽器解析js生成的html出現(xiàn)樣式問(wèn)題的解決方法

    瀏覽器解析js生成的html出現(xiàn)樣式問(wèn)題的解決方法

    接觸css, javascript有三年多了,今天遇到的問(wèn)題最令我不可思議,很容易給人一種錯(cuò)覺(jué),那就是js拼成的html結(jié)構(gòu)肯定有問(wèn)題
    2012-04-04
  • 利用JS將圖標(biāo)字體渲染為圖片的方法詳解

    利用JS將圖標(biāo)字體渲染為圖片的方法詳解

    在軟件開(kāi)發(fā)中肯定要用到圖標(biāo),比如下圖的?Groove?音樂(lè)中就用到了許多圖標(biāo)。一種獲取這些圖標(biāo)的方法是把?Groove?音樂(lè)截個(gè)圖,然后熟練地開(kāi)啟?Photoshop,開(kāi)始摳圖。這種方式很遜,效率也很低。本文將利用JS將圖標(biāo)字體渲染為圖片,需要的可以參考一下
    2022-05-05
  • 微信小程序自定義頂部組件customHeader的示例代碼

    微信小程序自定義頂部組件customHeader的示例代碼

    這篇文章主要介紹了微信小程序自定義頂部組件customHeader的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • JS實(shí)現(xiàn)的點(diǎn)擊按鈕圖片上下滾動(dòng)效果示例

    JS實(shí)現(xiàn)的點(diǎn)擊按鈕圖片上下滾動(dòng)效果示例

    這篇文章主要介紹了JS實(shí)現(xiàn)的點(diǎn)擊按鈕圖片上下滾動(dòng)效果,涉及javascript事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-01-01
  • JS中Eval解析JSON字符串的一個(gè)小問(wèn)題

    JS中Eval解析JSON字符串的一個(gè)小問(wèn)題

    JSON (JavaScript Object Notation)一種簡(jiǎn)單的數(shù)據(jù)格式,比xml更輕巧,下面通過(guò)本文給大家介紹JS中Eval解析JSON字符串的一個(gè)小問(wèn)題,需要的朋友參考下吧
    2016-02-02
  • javascript div 遮罩層封鎖整個(gè)頁(yè)面

    javascript div 遮罩層封鎖整個(gè)頁(yè)面

    在客戶端瀏覽器中,可以在某個(gè)時(shí)機(jī)使用javascript把一個(gè)div作為遮罩層,來(lái)封鎖整個(gè)頁(yè)面。
    2009-07-07
  • JavaScript中l(wèi)ayim之整合右鍵菜單的示例代碼

    JavaScript中l(wèi)ayim之整合右鍵菜單的示例代碼

    這篇文章主要介紹了JavaScript中l(wèi)ayim之整合右鍵菜單的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • JavaScript 對(duì)象模型 執(zhí)行模型

    JavaScript 對(duì)象模型 執(zhí)行模型

    JavaScript 對(duì)象模型-執(zhí)行模型分析
    2009-12-12
  • JavaScript輸入分鐘、秒倒計(jì)時(shí)技巧總結(jié)(附代碼)

    JavaScript輸入分鐘、秒倒計(jì)時(shí)技巧總結(jié)(附代碼)

    這篇文章主要介紹了JavaScript輸入分鐘、秒倒計(jì)時(shí)的代碼實(shí)現(xiàn),通過(guò)css和js代碼展示了邏輯過(guò)程,具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • 詳談javascript中的cookie

    詳談javascript中的cookie

    cookie其實(shí)就是網(wǎng)站放在用戶機(jī)器上的一小塊信息,cookie對(duì)于用戶來(lái)說(shuō)是唯一的,網(wǎng)站可判斷用戶上次訪問(wèn)網(wǎng)站的時(shí)間,以及他訪問(wèn)了哪些頁(yè)面,可用于在某個(gè)網(wǎng)站跟蹤你訪問(wèn)的頁(yè)面,但無(wú)法用它來(lái)獲取個(gè)人信息。
    2015-06-06

最新評(píng)論

昭苏县| 庆阳市| 保靖县| 永康市| 清涧县| 石景山区| 瓮安县| 蒙城县| 教育| 托克托县| 沭阳县| 怀化市| 治县。| 南康市| 大荔县| 普兰店市| 东至县| 佳木斯市| 额济纳旗| 亳州市| 大同县| 都安| 长岭县| 乐亭县| 陇南市| 台湾省| 兴隆县| 晋宁县| 泰安市| 清新县| 铁力市| 平凉市| 泸水县| 武城县| 靖州| 靖安县| 永新县| 汝城县| 寿光市| 通渭县| 云和县|