Reflect 映射
1. Reflect 映射
Reflect
对象与 Proxy
对象一样,也是 ES6
为了操作对象而提供的新 API
Reflect
是一个内置的对象,而不是一个函数对象,因此它是不可构造的
Reflect
作用:
- 优化
Object
的一些操作方法以及合理的返回Object
操作返回的结果 Proxy
在拦截访问目标对象,或者对代理对象操作都是通过Reflect
映射来完成
let obj = {
name: 'jsx'
};
// 获取对象属性
console.log(Reflect.ownKeys(obj)); // ['name']
// 结合Proxy使用
let proxy = new Proxy(obj, {
get(target, prop, receiver) {
return Reflect.get(target, prop, receiver);
},
set(target, prop, value, receiver) {
return Reflect.set(target, prop, value, receiver)
}
})
console.log(proxy.name); // jsx
console.log(proxy.title = 'Reflect映射'); // Reflect映射
2. Reflect 静态方法
对于每个可被 Proxy
捕获的内部方法,在 Reflect
中都有一个对应的方法,其名称和参数与 Proxy
捕捉器相同
Proxy
对象可以方便地调用对应的 Reflect
方法,完成默认行为,作为修改行为的基础。也就是说,不管Proxy
怎么修改默认行为,你总可以在Reflect
上获取默认行为
2-1 Reflect.get
Reflect.get(target, name, receiver)
Reflect.get
方法查找并返回target
对象的name
属性,如果没有该属性,则返回undefined
- 如果
name
属性部署了读取函数get()
,则读取函数的this
绑定receiver
- 如果第一个参数不是对象,
Reflect.get
方法会报错``
// Reflect.get(target, name, receiver) 返回target对象的name属性
let myobj = {
name: 'jsx',
age: 22,
get info() {
return this.name + ' ' + this.age
}
}
console.log(Reflect.get(myobj, 'name')) // jsx
// 没有属性返回undefined
console.log(Reflect.get(myobj, 'names')); // undefined
// 设置 get()函数后 this 指向第三个参数 receiver
let receiver = {
name: 'ljj',
age: 23
}
console.log(Reflect.get(myobj, 'info', receiver)); // ljj 23
// 第一个参数必须是对象,否则报错
// console.log(Reflect.get(true, 'name')) Uncaught TypeError
2-2 Reflect.set
Reflect.set(target, name, value, receiver)
-
Reflect.set
方法设置target
对象的name
属性等于value
-
如果
name
属性设置了赋值函数,则赋值函数的this
绑定receiver
-
如果第一个参数不是对象,
Reflect.set
会报错
// Reflect.set(target, name, value, receiver)
// 设置target对象的name属性等于value 返回布尔值
let myobj = {
name: 'jsx',
age: