代理(Proxy)和反射(Reflection)API
代理是一种可以拦截并改变底层javascript引擎操作的包装器,在新语言中通过它暴露内部运作对象,从而让开发者可以创建内建的对象。
代理陷阱 | 覆写的特性 | 默认特性 |
---|---|---|
get | 读取一个属性值 | Reflect.get() |
set | 写入一个属性值 | Reflect.set() |
has | in操作符 | Reflect.has() |
deleteProperty | delete操作符 | Reflect.deleteProperty() |
getPropertyOf | Object.getPropertyOf() | Reflect.getPropertyOf() |
setPropertyOf | Object.setPropertyOf() | Reflect.setPropertyOf() |
isExtensible | Object.isExtensible() | Reflect.isExtensible() |
preventExtensions | Object.preventExtensions() | Reflect.preventExtensions() |
getOwnPropertyDescriptor | Object.getOwnPropertyDescriptor() | Reflect.getOwnPropertyDescriptor() |
defineProperty | Object.defineProperty() | Reflect.defineProperty() |
ownKeys | Object.keys() Object.getOwnPropertyNames() Object.getOwnPropertySymbols() |
Reflect.ownKeys() |
apply | 调用一个函数 | Reflect.apply() |
construct | 用new调用一个函数 | Reflect.construct() |
## 创建一个简单的代理
let target = {}
let proxy = new Proxy(target,{}),
proxy.name = "proxy";
console.log(proxy.name) // proxy
console.log(target.name) // proxy
target.name = "target"
console.log(proxy.name) // target
console.log(target.name) // target
使用set陷阱验证属性
接受4个参数
- trapTarget 用于接收属性(代理的目标) 的对象
- key 要写入的属性键
- value 被写入属性的值
- receiver 操作发生的对象(通常是代理)
let target = {
name:"target"
}
let proxy = new Proxy(target,{
set(trapTarget,key,value,recevier){
// 忽略不希望受到影响的已有属性
if(!trapTarget.hasOwnProperty(key)){
if(isNaN(value)){
throw new TypeError('属性必须是数字')
}
}
// 添加属性
return Reflect.set(trapTarget,key,value,recevier)
}
})
proxy.count = 1;
console.log(proxy.count) // 1
console.log(target.count) // 1
// 由于目标已经有name属性因而可以给它赋值
proxy.name = "proxy"
console.log(proxy.name) // proxy
console.log(target.name) // proxy
// 给不存在的属性赋值会抛出错误
proxy.otherName = "proxy"
后面的不想看……有空再说吧
主题测试文章,只做测试使用。发布者:Walker,转转请注明出处:https://joyjs.cn/archives/4340