摘要:用于修改某些操作的默認(rèn)行為基本操作有屬性查找,賦值,枚舉,函數(shù)調(diào)用等。報(bào)錯(cuò)攔截某個(gè)屬性的賦值操作目標(biāo)對(duì)象屬性名屬性值代理本身攔截的操作,返回一個(gè)布爾值。
Proxy 用于修改某些操作的默認(rèn)行為(基本操作有屬性查找,賦值,枚舉,函數(shù)調(diào)用等)。
/* * target 目標(biāo)對(duì)象(可以是任何類(lèi)型的對(duì)象,包括原生數(shù)組,函數(shù),甚至另一個(gè)代理) * handler 一個(gè)對(duì)象,其屬性是操作對(duì)應(yīng)的自定義代理函數(shù) */ let p = new Proxy(target, handler);基本操作
1、get(target, propKey, receiver):攔截對(duì)象屬性的讀取
/* * target 目標(biāo)對(duì)象 * propKey 對(duì)象屬性名 * proxy 實(shí)例本身(嚴(yán)格地說(shuō),是操作行為所針對(duì)的對(duì)象) */ get(target, propKey, receiver)
var obj = {name : "Lucy"} var p = new Proxy(obj,{ get : function(target,key,receive){ return key === "name" ? "Hello "+target[key] : target[key] } }) p.name //Hello Lucy
需要注意的是,如果一個(gè)屬性不可配置(configurable)且不可寫(xiě)(writable),則 Proxy 不能修改該屬性。
var obj = Object.defineProperties({}, { name: { value: "Lucy", writable: false, configurable: false }, }); var p = new Proxy(obj, { get : function(target,key){ return key === "name" ? "Hello "+target[key] : target[key] } }); p.name //報(bào)錯(cuò)
2、set: function(obj, prop, value,receive) : 攔截某個(gè)屬性的賦值操作
/* * target 目標(biāo)對(duì)象 * key 屬性名 * value 屬性值 * receive 代理本身 */ set: function(target, key, value,receive)
var obj = {age : 18} var p = new Proxy(obj,{ set : function(target,key,value){ if(key === "age"){ target[key] = Math.min(value,100); }else{ target[key] = value; } } }) p.age = 101; p.age // 100 obj.age // 100
3、has(target, key):攔截key in proxy的操作,返回一個(gè)布爾值。
4、deleteProperty(target, propKey):攔截delete proxy[propKey]的操作,返回一個(gè)布爾值。
5、ownKeys(target):ownKeys方法用來(lái)攔截對(duì)象自身屬性的讀取操作,返回一個(gè)數(shù)組。具體來(lái)說(shuō),攔截以下操作:
Object.getOwnPropertyNames() //返回所有屬性
Object.getOwnPropertySymbols()
Object.keys(proxy) //返回可枚舉屬性
for...in循環(huán)
var obj = Object.create(null) Object.defineProperties(obj, { "_id": { value: 1, configurable : true, writable : true, enumerable : true }, "name": { value : "Lucy", configurable : true, writable : true, enumerable : true } }); Object.getOwnPropertyNames(obj) // ["_id","name"] for(let key in obj){ console.log(key) //依次輸出_id,name } var p = new Proxy(obj,{ ownKeys : function(target){ return Object.getOwnPropertyNames(target).filter(x => x[0] != "_") } }) Object.getOwnPropertyNames(p) // ["name"] for(let key in p){ console.log(key) //輸出name }
6、getOwnPropertyDescriptor(target, propKey):攔截Object.getOwnPropertyDescriptor(proxy, propKey),返回屬性的描述對(duì)象。
7、defineProperty(target, propKey, propDesc):返回一個(gè)布爾值,攔截以下操作
Object.defineProperty(proxy, propKey, propDesc)
Object.defineProperties(proxy, propDescs)
8、preventExtensions(target):攔截Object.preventExtensions(proxy),返回一個(gè)布爾值。
9、getPrototypeOf(target):攔截Object.getPrototypeOf(proxy),返回一個(gè)對(duì)象。
10、isExtensible(target):攔截Object.isExtensible(proxy),返回一個(gè)布爾值。
11、setPrototypeOf(target, proto):攔截Object.setPrototypeOf(proxy, proto),返回一個(gè)布爾值。如果目標(biāo)對(duì)象是函數(shù),那么還有兩種額外操作可以攔截。
12、apply(target, object, args):攔截 Proxy 實(shí)例作為函數(shù)調(diào)用的操作,比如
proxy(...args)
proxy.call(object, ...args)
proxy.apply(...)
13、construct(target, args):攔截 Proxy 實(shí)例作為構(gòu)造函數(shù)調(diào)用的操作,比如new proxy(...args)。
參考資料:Proxy MDN
ECMAScript 6入門(mén)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/105353.html
摘要:本文是重溫基礎(chǔ)系列文章的第十四篇。元,是指程序本身。有理解不到位,還請(qǐng)指點(diǎn),具體詳細(xì)的介紹,可以查看維基百科元編程。攔截,返回一個(gè)布爾值。 本文是 重溫基礎(chǔ) 系列文章的第十四篇。 這是第一個(gè)基礎(chǔ)系列的最后一篇,后面會(huì)開(kāi)始復(fù)習(xí)一些中級(jí)的知識(shí)了,歡迎持續(xù)關(guān)注呀! 接下來(lái)會(huì)統(tǒng)一整理到我的【Cute-JavaScript】的JavaScript基礎(chǔ)系列中。 今日感受:獨(dú)樂(lè)樂(lè)不如眾樂(lè)樂(lè)...
摘要:前端平時(shí)接觸到的機(jī)會(huì)并不多,但是懂點(diǎn)對(duì)于前端來(lái)說(shuō)還是有益無(wú)害的,起碼還是要了解一下最基本的部署知識(shí)。特別注意的是,國(guó)內(nèi)注冊(cè)的域名要實(shí)名備案,否則無(wú)法域名解析。 前端平時(shí)接觸到linux的機(jī)會(huì)并不多,但是懂點(diǎn)linux對(duì)于前端來(lái)說(shuō)還是有益無(wú)害的,起碼還是要了解一下最基本的部署知識(shí)。 博客地址 購(gòu)買(mǎi)服務(wù)器 要部署項(xiàng)目,首先我們需要一臺(tái)服務(wù)器。平時(shí)開(kāi)發(fā),項(xiàng)目是跑在我們本地電腦上的,現(xiàn)在我們想...
摘要:考慮到這一點(diǎn),我們花費(fèi)了一些時(shí)間審查了我們維護(hù)的多種系統(tǒng),并在這星期,我給我們的私人注冊(cè)中心設(shè)置了添加身份認(rèn)證的目標(biāo)。你也許知道,注冊(cè)沒(méi)有提供身份認(rèn)證的方法。授權(quán)響應(yīng)觸發(fā)客戶(hù)端回應(yīng)一組使用基本身份驗(yàn)證的憑據(jù)。 注:原文作者是 Alex Ianchici,原文地址是 Docker private registry authentication 安全已經(jīng)融入了我們的生活。我們鎖門(mén)...
摘要:考慮到這一點(diǎn),我們花費(fèi)了一些時(shí)間審查了我們維護(hù)的多種系統(tǒng),并在這星期,我給我們的私人注冊(cè)中心設(shè)置了添加身份認(rèn)證的目標(biāo)。你也許知道,注冊(cè)沒(méi)有提供身份認(rèn)證的方法。授權(quán)響應(yīng)觸發(fā)客戶(hù)端回應(yīng)一組使用基本身份驗(yàn)證的憑據(jù)。 注:原文作者是 Alex Ianchici,原文地址是 Docker private registry authentication 安全已經(jīng)融入了我們的生活。我們鎖門(mén)...
閱讀 1171·2021-10-15 09:39
閱讀 3070·2021-09-10 10:50
閱讀 3464·2019-08-30 15:53
閱讀 1890·2019-08-30 15:52
閱讀 2578·2019-08-29 15:31
閱讀 1985·2019-08-26 13:43
閱讀 2606·2019-08-26 13:37
閱讀 1450·2019-08-23 18:31