1. Reflect是什么?
Reflect对象与Proxy对象一样,也是ES6为了操作对象而提供的新API。Reflect对象的设计目的有这样几个:
(1)将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现在某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect上。也就是说,从Reflect对象上可以拿到语言内部的方法。
(2)让某些Object方法的返回结果更合理。比如,Object.defineProperty在无法定义属性时,会抛出一个错误。而Reflect.defineProperty则会返回false。(但是,Reflect大部分静态方法都会因为参数不是object对象而报错。)
(3)让Object操作都变成函数行为。比如:name in obj和delete obj[name]都是命令式, Reflect.has(obj, name)和Reflect.deleteProperty让它们变成了函数行为。
(4)Reflect对象与Proxy对象方法一一对应。可以作用Proxy修改默认行为的基础。
(5)很多方法更易读:
// 老写法 Function.prototype.apply.call(Math.floor, undefined, [1.75]) // 1
// 新写法 Reflect.apply(Math.floor, undefined, [1.75]) // 1
2. 静态方法
Reflect一共13个常用静态方法。
Reflect.get(target, name, receiver)
Reflect.set(target, name, value, receiver)
Reflect.has(target, name)
Reflect.deleteProperty(target, name)
Reflect.getPrototypeOf(target)
Reflect.setPrototypeOf(target, prototype)
Reflect.construct(target, args)
Reflect.apply(target, thisArg, args)
Reflect.defineProperty(target, name, desc)
Reflect.getOwnPropertyDescriptor(target, name)
Reflect.isExtensible(target)
Reflect.preventExtensions(target)
Reflect.ownKeys(target)
大部分方法的作用,与Object对象的同名方法作用相同,而且与Proxy对象的方法一一对应。