说说ES6中Proxy的理解
# 是什么
Proxy:创建一个对象的代理,从而实现基本操作的拦截和至自定义方法(如属性查找、赋值、枚举、函数调用等)
# 怎么用
var proxy = new Proxy(target, handler);
- target,操作对象
- handler, 处理集合
get(target,propKey,receiver):拦截对象属性的读取
set(target,propKey,value,receiver):拦截对象属性的设置
has(target,propKey):拦截propKey in proxy的操作,返回一个布尔值
deleteProperty(target,propKey):拦截delete proxy[propKey]的操作,返回一个布尔值
ownKeys(target):拦截Object.keys(proxy)、for...in等循环,返回一个数组
getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象
defineProperty(target, propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc),返回一个布尔值
preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值
getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象
isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值
setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值
apply(target, object, args):拦截 Proxy 实例作为函数调用的操作
construct(target, args):拦截 Proxy 实例作为构造函数调用的操作
# 使用场景
类似于设计模式中的代理模式
- 拦截和监视外部对对象的访问
- 降低函数或类的复杂性
- 在复杂操作前进行校验或多所需资源进行管理
let api = {
_apiKey: "123abc456def",
getUsers: function() {},
getUser: function(userId) {},
setUser: function(userId, config) {},
};
const RESTRICTED = ["_apiKey"];
api = new Proxy(api, {
get(target, key, proxy) {
if (RESTRICTED.indexOf(key) > -1) {
throw Error(`${key} 不可访问.`);
}
return Reflect.get(target, key, proxy);
},
set(target, key, value, proxy) {
if (RESTRICTED.indexOf(key) > -1) {
throw Error(`${key} 不可修改`);
}
return Reflect.get(target, key, value, proxy);
},
});
console.log(api._apiKey);
api._apiKey = "987654321";
// 上述都抛出错误
# FAQ
上次更新: 2021/12/19, 18:05:42