Proxy
2020 javascriptProxy 对象可以对一个对象进行代理,可以拦截对象和重新定义拦截的对象,Proxy 返回一个新的代理对象。
参数
一个 Proxy 创建伴随着两个参数:
target
: 要代理的原始对象handler
: 对原始对象进行拦截或者拦截后重新定义的对象
const proxy = new Proxy(target, handler);
简单实例
const handler = {
get: function (target, prop) {
return prop in target ? target[prop] : 37;
},
};
const target = {
a: 1,
b: undefined,
};
const p = new Proxy(target, handler);
console.log(p.a, p.b, p.c); // 1, undefined, 37
console.log(target); // { a: 1, b: undefined }
trap 列表
来自官方的一个 trap 列表实例:
var docCookies = new Proxy(docCookies, {
get: function (oTarget, sKey) {
return oTarget[sKey] || oTarget.getItem(sKey) || undefined;
},
set: function (oTarget, sKey, vValue) {
if (sKey in oTarget) {
return false;
}
return oTarget.setItem(sKey, vValue);
},
deleteProperty: function (oTarget, sKey) {
if (!sKey in oTarget) {
return false;
}
return oTarget.removeItem(sKey);
},
enumerate: function (oTarget, sKey) {
return oTarget.keys();
},
ownKeys: function (oTarget, sKey) {
return oTarget.keys();
},
has: function (oTarget, sKey) {
return sKey in oTarget || oTarget.hasItem(sKey);
},
defineProperty: function (oTarget, sKey, oDesc) {
if (oDesc && 'value' in oDesc) {
oTarget.setItem(sKey, oDesc.value);
}
return oTarget;
},
getOwnPropertyDescriptor: function (oTarget, sKey) {
var vValue = oTarget.getItem(sKey);
return vValue
? {
value: vValue,
writable: true,
enumerable: true,
configurable: false,
}
: undefined;
},
});