reflect
一句话就是调用对象的基本方法
因为js对象很多操作方法是没有暴露出来的,通过封装好的语法调用就好,通过reflect就可以调用js对象的基本方法,具体可以调用哪些可以去MDN查看。
MDN解释:Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与 proxy handler 的方法相同。
Reflect不是一个函数对象,因此它是不可构造的。 developer.mozilla.org/zh-CN/docs/… 。
下面举几个例子来帮助理解:
获取对象属性简单例子:
当我们使用语法读取对象属性,可以理解成实际上执行时候会执行一个被封装过后的方法,然后在封装方法中调用对象的基本方法get获取对象内容。
let obj = {
a:1,
b:2,
get c() {
return this.a + this.b;
}
}
console.log(obj.c);// 当我们使用语法读取对象属性,实际上执行时候会执行一个被封装过后的方法,然后在封装方法中调用对象的基本方法
console.log(Reflect.get(obj,'c'));// 调用对象的基本方法,通过get调用
console.log(Reflect.get(obj,'c',{a:10,b:30}));// 调用对象的基本方法,第三个参数receiver指定this指向,返回40
获取对象所有属性例子:
js对象基本方法有个 ownKeys 用来获取对象所有属性, 返回一个包含所有自身属性(不包含继承属性)的数组
let obj = {
a:1,
b:2,
get c() {
return this.a + this.b;
}
}
// 获取对象所有属性
// 先添加一个不可枚举的属性
Object.defineProperty(obj,'d',{
value:4,
enumerable:false
})
console.log(Object.keys(obj));// 获取对象所有属性,但是正常调用的封装方法会过滤掉不可枚举的
console.log(Reflect.ownKeys(obj));// 通过直接调用基本方法获取,获取对象所有属性
proxy代理例子:
通过指定receiver保证了this指向无误
let obj = {
a:1,
b:2,
get c() {
return this.a + this.b;
}
}
// 代理例子
const proxy = new Proxy(obj,{
get(target,key,receiver) {
console.log('get',target,key,receiver);
// 如果不设置receiver,获取c的时候,此时c的this是target,也就是原始对象obj,而不是代理对象proxy
// 所以获取c的时候,只监听到了c,没有监听到a,b的获取
// return Reflect.get(target,key);
return Reflect.get(target,key,receiver);
}
})
console.log(proxy.c);// 调用对象的基本方法