Reflect对象是ES6为了操作对象提供的新的API,它为了实现将object对象上的一些明显属于语言内部的方法放到Reflect对象上;修改某些Object的方法的返回结果,让其变得更加合理(即减少报错);让object操作都变成函数行为;Reflect对象的方法和Proxy对象的方法一一对应,这让proxy的修改默认操作有了基础,即使修改了Proxy的默认行为也可以从reflect上获取默认行为。
Reflect对象的静态方法:Reflect.get(target,name,receiver)查找返回target的name属性,如果没有该属性则返回undefined,如果name属性部署了读取函数则读取函数this绑定receiver,如果第一个参数不是对象那么报错;Reflect.set(target,name,value,receiver)设置target的name属性为value,如果name属性设置了赋值函数那么this绑定receiver,如果第一个参数不是对象那么报错;Reflect.has(obj,name)对应name in obj里的in运算符,如果第一个参数不是对象报错;Reflect.deleteProperty(obj,name)等同于delete obj[name],用于删除对象属性,如果删除成功或者被删除的属性不存在那么返回true否则返回false;Reflect.construct(target,args)等同于new target(...args)提供一种不使用new方法来调用构造函数;Reflect.getPropertyOf(obj)用来读取对象的__proto__属性,对应Object.getPropertyOf(obj),唯一不同的是Object.getPropertyof的参数不是对象的话会被转化为对象,而Reflect对象就会报错;Reflect.setPropertyOf(obj,newProto)设置对象的__proto__属性,返回第一个参数对象,对应Object.setPropertyOf(obj,newProto),如果第一个参数不是对象Object.setPropertyOf(obj,newProto)返回都一个参数而Reflect报错,如果第一个参数是undefined或者null那么都会报错;Reflect.apply(func,thisArg,args)等同于Function.prototype.apply.call(func,thisArg,args)用于绑定this对象后执行给定的函数,一般来说如果要绑定一个函数的this对象可以写成fn.apply(obj,args) ,如果函数定义了自己的apply方法了只能写成Function.prototype.apply.call(fn,obj,args);Reflect.defineProperty(target,propertyKey,attribute)等同于Object.defineProperty用来定义对象属性,第一个参数不是对象那么就会报错;Reflect.getOwnPropertyDescriptor(target,propertyKey)等同于Object.getOwnPropertyDescriptor用来得到指定属性的描述对象,唯一的区别是如果第一个参数不是对象的话Object.getOwnPropertyDescriptor返回undefined,而reflect报错表示参数非法;Reflect.isExtensible(target)相当于Object.isExtensible返回一个布尔值表示当前对象是否可扩展,唯一的区别是Object.isExtensible的参数不是对象那么返回false,而Reflect报错;Reflect.preventExtensions(target)对应Object.preventExtensions,用于使一个对象不可扩展,返回一个布尔值表示是否操作成功,如果参数书不是对象Object.preventExtensions在ES5报错在ES6返回参数本身而Reflect报错;Reflect.ownkeys(target)返回对象的所有属性。