Reflect
描述
Reflect 是一个操作对象的API
Reflect 是一个内置的全局对象,它提供拦截 JavaScript 操作的方法。它不是一个函数对象,所以不能用new
优势:
相较于之前处理对象的方法 例如Function.prototype.apply\ delete\ in之类的,将一些明显属于语言内部的函数都添加到了Reflect对象中,用一个单一的全局对象去存储这些函数,能够保持JS代码的干净、整洁。
不然的话,这些函数可能是全局的,或者要通过原型来调用, 不方便统一管理。并将一些命令式的操作如delete、in等使用函数来代替,可以让代码更好的维护
const obj = {key: 'id'} 'key' in obj
=>
Reflect.has(obj,'key')
如果一个对象是不能拓展的,那么在调用Object.defineProperty(obj, name, desc)时,会抛出一个异常
const obj = {key: 'id'}; Object.freeze(obj); Object.defineProperty(obj, 'name', {});
之前我们需要使用try catch来防止页面阻塞
try { Object.defineProperty(obj, 'name', {}); } catch(e) { console.error(e.message) }
现在可以直接用if else进行判断了
if(Reflect.defineProperty(obj, 'name', {})) { // To do... } else { // To do... }
- 静态函数
- Reflect.apply(target, thisArgument, argumentsList) 取代了之前的Function.prototype.apply
function setXY(x, y) { this.x = x; this.y = y; }; const obj = {};
setXY.apply(obj, [1,2])=> Reflect.apply(setXY, obj, [1,2]); console.log(obj); //{x: 1, y: 2}
- construct 提供了一种不用new来调用构造函数的方法
function Animal(name) { this.name = name; }; const dog = new Animal('Wang Cai'); const cat = Reflect.construct(Animal, ['Mao Mi']);
- deleteProperty 取代了之前的delete
const obj = {key: 'id'}; delete obj.key => Reflect.deleteProperty(obj, 'key'); // true or false
- has