1、Reflect的概述
Reflect能将Object 对象的一些明显属于语言内部的方法(比如 Object.defineProperty ),放到Reflect对象上。
Reflect方法与Proxry的方法对应,只要是 Proxy 对象的方法,就能在 Reflect 对象上找到对应的方法。 所以Proxy 对象可以方便地调用对应的 Reflect 方法,完成默认行为,作为修改行为的基础。也就是说,不管 Proxy 怎么修改默认行为,总可以在 Reflect 上获取默认行为。
代码示例1:
var loggedObj = new Proxy(obj, {
get(target, name) {
console.log('get', target, name);
return Reflect.get(target, name);
},
deleteProperty(target, name) {
console.log('delete' + name);
return Reflect.deleteProperty(target, name);
},
has(target, name) {
console.log('has' + name);
return Reflect.has(target, name);
}
});
代码示例2:
var myObject = {
foo: 4,
set bar(value) {
return this.foo = value;
},
};
var myReceiverObject = {
foo: 0,
};
Reflect.set(myObject, 'bar', 1);
console.log(myObject.foo) // 1
console.log(myReceiverObject.foo) // 0
Reflect.set(myObject, 'bar', 2, myReceiverObject);
console.log(myObject.foo) // 1
console.log(myReceiverObject.foo) // 2
如果 Proxy 对象和 Reflect 对象联合使用,前者拦截赋值操作,后者完成赋值的默认行为,而且传入了 receiver ,那么 Reflect.set 会触发 Proxy.defineProperty 拦截。
代码示例3:
let p = {
a: 'vv'
};
let handler = {
set(target, key, value, receiver) {
console.log('set');
Reflect.set(target, key, value, receiver)
},
defineProperty(target, key, attribute) {
console.log('defineProperty');
Reflect.defineProperty(target, key, attribute);
}
};
let obj = new Proxy(p, handler);
obj.a = 'VV';
// set
// defineProperty
2、Reflect的静态方法
Reflect对象一共有13个静态方法。这些方法与 Proxy 对象的方法是一一对应的,并且大部分与 Object 对象的同名方法的作用都是相同的。
- Reflect.apply(target, thisArg, args)
- Reflect.construct(target, args)
- Reflect.get(target, name, receiver)
- Reflect.set(target, name, value, receiver)
- Reflect.defineProperty(target, name, desc)
- Reflect.deleteProperty(target, name)
- Reflect.has(target, name)
- Reflect.ownKeys(target)
- Reflect.isExtensible(target)
- Reflect.preventExtensions(target)
- Reflect.getOwnPropertyDescriptor(target, name)
- Reflect.getPrototypeOf(target)
- Reflect.setPrototypeOf(target, prototype)