Reflect
对象与Proxy
对象一样,为了操作对象而提供的新 API。Reflect
对象的设计目的有:
1) 将Object
对象的一些明显属于语言内部的方法(如Object.defineProperty
),放到Reflect
对象上。
2) 修改某些Object
方法的返回结果,让其变得更合理。如Object.defineProperty(obj, name, desc)
在无法定义属性时,会报错,而Reflect.defineProperty(obj, name, desc)
则会返回false
。
3) 让Object
操作都变成函数行为。
4)Reflect
对象的方法与Proxy
对象的方法一一对应,只要是Proxy
对象的方法,就能在Reflect
对象上找到对应的方法,即不管Proxy
怎么修改默认行为,你总可以在Reflect
上获取默认行为。
有了Reflect
对象以后,很多操作会更易读。
// 老写法
Function.prototype.apply.call(Math.floor, undefined, [1.75]) // 1
// 新写法
Reflect.apply(Math.floor, undefined, [1.75]) // 1
Reflect.deleteProperty
方法等同于delete obj[name]
,用于删除对象的属性。
const myObj = { foo: 'bar' };
// 旧写法
delete myObj.foo;
// 新写法
Reflect.deleteProperty(myObj, 'foo');
Reflect.apply
方法等同于Function.prototype.apply.call(func, thisArg, args)
,用于绑定this
对象后执行给定函数。
const ages = [11, 33, 12, 54, 18, 96];
// 旧写法
const youngest = Math.min.apply(Math, ages);
// 新写法
const youngest = Reflect.apply(Math.min, Math, ages);