【ES6】Proxy
Proxy代理器
Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。
Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。
let proxy = new Proxy(target, handler);
target为拦截的目标对象,handler参数也是一个对象,用来定制拦截行为。如果handler没有设置任何拦截,那就等同于直接通向原对象。要使得Proxy起作用,必须针对proxy实例进行操作,而不是针对目标对象进行操作。
一个技巧是将 Proxy 对象,设置到object.proxy属性,从而可以在object对象上调用。
var object = { proxy: new Proxy(target, handler) };
Proxy 实例也可以作为其他对象的原型对象。
var proxy = new Proxy({}, {
get: function(target, propKey) {
return 35;
}
});
let obj = Object.create(proxy);
obj.time // 35
具体方法:
let proxy = new Proxy(obj, {
get(target, propKey, receiver) {
// 参数依次为目标对象,属性名,proxy实例
if (propKey in target) {
return target[propKey];
} else {
throw new ReferenceError("不存在该属性");
}
},
set(target, property, value, receiver) {
return value;
},
has(target, propKey) {}, // 拦截propKey in proxy
deleteProperty(target, propKey) {}, // 拦截delete proxy[propkey]
ownKeys(target) {}, // 拦截器Object.getOwnPropertyNames()、Object.getOwnPropertyDescriptors()、Object.keys(proxy)、for in
getOwnPropertyDescriptor(target, propKey) {}, // 拦截Object.getOwnPropertyDescriptor(proxy, propKey)
defineProperty(target, propKey, propDesc) {}, // 拦截Object.defineProperty(proxy, propKey, propDesc)、Object.defineProperties(proxy, propDescs)
getPrototypeOf(target) {}, // 拦截Object.getPrototypeOf(proxy)
setPrototypeOf(target, proto) {}, // 拦截Object.setPrototypeOf(proxy, proto)
preventExtensions(target) {}, // 拦截Object.preventExtensions(proxy)
isExtensible(target) {}, // 拦截Object.isExtensible(proxy)
apply(target, object, args){}, // 拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)、proxy.call(object, ...args)、proxy.apply(...)
construct(target, args){} // 拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)
});
详细参考:http://es6.ruanyifeng.com/#docs/proxy

浙公网安备 33010602011771号