Proxy 對象用于定義基本操作的自定義行為(如屬性查找惭笑,賦值坯约,枚舉,函數(shù)調(diào)用等)漓糙。
語法
let obj = new Proxy(target, handler);
參數(shù)
-
target
用Proxy
包裝的目標(biāo)對象(可以是任何類型的對象,包括原生數(shù)組烘嘱,函數(shù)昆禽,甚至另一個代理)。 -
handler
一個對象蝇庭,其屬性是當(dāng)執(zhí)行一個操作時定義代理的行為的函數(shù)醉鳖。
Proxy 支持的攔截操作
get(target, propKey, receiver)
:攔截對象屬性的讀取,比如proxy.foo
和proxy['foo']
哮内。set(target, propKey, value, receiver)
:攔截對象屬性的設(shè)置盗棵,比如proxy.foo = v
或proxy['foo'] = v
,返回一個布爾值北发。set(target, propKey, value, receiver)
:攔截對象屬性的設(shè)置漾根,比如proxy.foo = v
或proxy['foo'] = v
,返回一個布爾值鲫竞。deleteProperty(target, propKey)
:攔截delete proxy[propKey]
的操作,返回一個布爾值逼蒙。ownKeys(target)
:攔截Object.getOwnPropertyNames(proxy)
从绘、Object.getOwnPropertySymbols(proxy)
、Object.keys(proxy)
是牢、for...in
循環(huán)僵井,返回一個數(shù)組。該方法返回目標(biāo)對象所有自身的屬性的屬性名驳棱,而Object.keys()
的返回結(jié)果僅包括目標(biāo)對象自身的可遍歷屬性批什。getOwnPropertyDescriptor(target, propKey)
:攔截Object.getOwnPropertyDescriptor(proxy, propKey)
,返回屬性的描述對象社搅。defineProperty(target, propKey, propDesc)
:攔截Object.defineProperty(proxy, propKey, propDesc)
驻债、Object.defineProperties(proxy, propDescs)
乳规,返回一個布爾值。preventExtensions(target)
:攔截Object.preventExtensions(proxy)
合呐,返回一個布爾值暮的。getPrototypeOf(target)
:攔截Object.getPrototypeOf(proxy)
,返回一個對象淌实。isExtensible(target)
:攔截Object.isExtensible(proxy)
冻辩,返回一個布爾值。setPrototypeOf(target, proto)
:攔截Object.setPrototypeOf(proxy, proto)
拆祈,返回一個布爾值恨闪。如果目標(biāo)對象是函數(shù),那么還有兩種額外操作可以攔截放坏。apply(target, object, args)
:攔截 Proxy 實例作為函數(shù)調(diào)用的操作咙咽,比如proxy(...args)
、proxy.call(object, ...args)
轻姿、proxy.apply(...)
犁珠。construct(target, args)
:攔截Proxy
實例作為構(gòu)造函數(shù)調(diào)用的操作,比如new proxy(...args)
互亮。
示例代碼
/**
* 代理
* @type {{get: (function(*, *): number)}}
*/
let handler = {
get: function (target, name) {
return name in target ? target[name] : 37;
}
};
let target = {a: 1, b: 2};
let p = new Proxy(target, handler);
p.a = 3;
p.b = undefined;
target.a = 1;
console.log(p.a, p.b);
console.log('c' in p, p.c);
console.log(p);
console.log(target);