Reflect是ES6起JavaScript内置的对象,提供拦截JavaScript操作的方法,这些方法与Proxy对象的handlers中的方法基本相同。
Reflect并非一个构造函数,所以不能通过new运算符对其进行调用,或者将Reflect对象作为一个函数来调用,就像Math对象一样,Reflect对象的所有属性和方法都是静态的。
实际上Reflect对象是ES6为操作对象而提供的新API,而这个API设计的目的主要有:
Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect上能拿到语言内部的方法,例如Object.defineProperty方法。Object方法返回的结果,例如Object.defineProperty(obj, name, desc)方法在无法定义属性的时候会抛出异常,而Reflect.defineProperty(obj, name, desc)方法在操作失败时则会返回false。Object的操作都变成函数行为,例如Object的命令式name in obj和delete obj[name]与Reflect.has(obj, name)、Reflect.deleteProperty(obj, name)相等。Reflect对象的方法与Proxy对象的方法一一对应,只要Proxy对象上能够定义的handlers方法Reflect也能找到。Reflect.apply(target, thisArgument, argumentsList)
静态方法Reflect.apply()通过指定的参数列表发起对目标target函数的调用,和Function.prototype.apply()功能类似。
target: 目标函数。thisArgument: target函数调用时绑定的this对象。argumentsList: target函数调用时传入的实参列表,该参数应该是一个类数组的对象。return: 返回值是调用完带着指定参数和this值的给定的函数后返回的结果。Reflect.construct(target, argumentsList[, newTarget])
Reflect.construct()方法的行为像new操作符构造函数,相当于运行new target(...args)。
target: 被运行的目标构造函数。argumentsList: 类数组对象,目标构造函数调用时的参数。newTarget: 可选,作为新创建对象的原型对象的constructor属性,默认值为target。Reflect.defineProperty(target, propertyKey, attributes)
方法Reflect.defineProperty()基本等同于Object.defineProperty()方法,唯一不同是返回Boolean值。
target: 目标对象。propertyKey: 要定义或修改的属性的名称。attributes: 要定义或修改的属性的描述。return: 返回Boolean值指示了属性是否被成功定义。Reflect.deleteProperty(target, propertyKey)
方法Reflect.deleteProperty()允许用于删除属性,类似于delete operator,但它是一个函数。
target: 删除属性的目标对象。propertyKey: 需要删除的属性的名称。return: 返回Boolean值表明该属性是否被成功删除。Reflect.get(target, propertyKey[, receiver])
Reflect.get()方法与从对象target[propertyKey]中读取属性类似,但它是通过一个函数执行来操作的。
target: 需要取值的目标对象propertyKey: 需要获取的值的键值receiver: 如果target对象中指定了getter,receiver则为getter调用时的this值。return: 返回属性的值。Reflect.getOwnPropertyDescriptor(target, propertyKey)
方法Reflect.getOwnPropertyDescriptor()与Object.getOwnPropertyDescriptor()方法相似,如果在对象中存在,则返回给定的属性的属性描述符,否则返回undefined。
target: 需要寻找属性的目标对象。propertyKey: 获取自己的属性描述符的属性的名称。Reflect.getPrototypeOf(target)
方法Reflect.getPrototypeOf()与Object.getPrototypeOf()方法几乎相同,都是返回指定对象的原型,即内部的[[Prototype]]属性的值。
target: 获取原型的目标对象。return: 给定对象的原型,如果给定对象没有继承的属性,则返回null。Reflect.has(target, propertyKey)
方法Reflect.has()作用与in操作符类似,但它是通过一个函数执行来操作的。
target: 目标对象.propertyKey: 属性名,需要检查目标对象是否存在此属性。return: 返回一个Boolean类型的对象指示是否存在此属性。Reflect.isExtensible(target)
方法Reflect.isExtensible()判断一个对象是否可扩展,即是否能够添加新的属性,与Object.isExtensible()方法相似。
target: 检查是否可扩展的目标对象。return: 返回一个Boolean值表明该对象是否可扩展。Reflect.ownKeys(target)
方法Reflect.ownKeys()返回一个由目标对象自身的属性键组成的数组。
target: 获取自身属性键的目标对象。return: 返回由目标对象的自身属性键组成的Array。Reflect.preventExtensions(target)
方法Reflect.preventExtensions()方法阻止新属性添加到对象,防止将来对对象的扩展被添加到对象中,该方法与Object.preventExtensions()相似。
target: 阻止扩展的目标对象。return: 返回一个Boolean值表明目标对象是否成功被设置为不可扩展。Reflect.set(target, propertyKey, value[, receiver])
方法Reflect.set()是在一个对象上设置一个属性。
target: 设置属性的目标对象。propertyKey: 设置的属性的名称。value: 设置的值。receiver: 如果遇到setter,receiver则为setter调用时的this值。return: 返回一个Boolean值表明是否成功设置属性。Reflect.setPrototypeOf(target, prototype)
除了返回类型以外,方法Reflect.setPrototypeOf()与Object.setPrototypeOf()方法是一样的,它可设置对象的原型即内部的[[Prototype]]属性,为另一个对象或null,如果操作成功返回true,否则返回false。
target: 设置原型的目标对象。prototype: 对象的新原型,为一个对象或null。return: 返回一个Boolean值表明是否原型已经成功设置。Method Name |
Object |
Reflect |
|---|
defineProperty() | Object.defineProperty()返回传递给函数的对象,如果未在对象上成功定义属性,则返回TypeError。 | 如果在对象上定义了属性,则Reflect.defineProperty()返回true,否则返回false。 |
| defineProperties() | Object.defineProperties() 返回传递给函数的对象。如果未在对象上成功定义属性,则返回TypeError。 | N/A |
| set() | N/A | 如果在对象上成功设置了属性,则Reflect.set()返回true,否则返回false。如果目标不是Object,则抛出TypeError |
| get() | N/A | Reflect.get()返回属性的值。如果目标不是Object,则抛出TypeError。 |
| deleteProperty() | N/A | 如果属性从对象中删除,则Reflect.deleteProperty()返回true,否则返回false。 |
| getOwnPropertyDescriptor() | 如果传入的对象参数上存在Object.getOwnPropertyDescriptor() ,则会返回给定属性的属性描述符,如果不存在,则返回undefined。 | 如果给定属性存在于对象上,则Reflect.getOwnPropertyDescriptor()返回给定属性的属性描述符。如果不存在则返回undefined,如果传入除对象(原始值)以外的任何东西作为第一个参数,则返回TypeError |
| getOwnPropertyDescriptors() | Object.getOwnPropertyDescriptors()返回一个对象,其中包含每个传入对象的属性描述符。如果传入的对象没有拥有的属性描述符,则返回一个空对象。 | N/A |
| getPrototypeOf() | Object.getPrototypeOf()返回给定对象的原型。如果没有继承的原型,则返回null。在ES5中为非对象抛出TypeError。 | Reflect.getPrototypeOf()返回给定对象的原型。如果没有继承的原型,则返回null,并为非对象抛出TypeError。 |
| setPrototypeOf() | 如果对象的原型设置成功,则Object.setPrototypeOf()返回对象本身。如果设置的原型不是Object或null,或者被修改的对象的原型不可扩展,则抛出TypeError。 | 如果在对象上成功设置了原型,则Reflect.setPrototypeOf()返回true,否则返回false(包括原型是否不可扩展)。如果传入的目标不是Object,或者设置的原型不是Object或null,则抛出TypeError。 |
| isExtensible() | 如果对象是可扩展的,则Object.isExtensible()返回true,否则返回false,如果第一个参数不是对象,则在ES5中抛出TypeError,在ES2015中,它将被强制为不可扩展的普通对象并返回false。 | 如果对象是可扩展的,则Reflect.isExtensible()返回true,否则返回false。如果第一个参数不是对象,则抛出TypeError。 |
| preventExtensions() | Object.preventExtensions()返回被设为不可扩展的对象,如果参数不是对象,则在ES5中抛出TypeError,在ES2015中,参数如为不可扩展的普通对象,然后返回对象本身。 | 如果对象已变得不可扩展,则Reflect.preventExtensions() 返回true,否则返回false。如果参数不是对象,则抛出TypeError。 |
| keys() | Object.keys()返回一个字符串数组,该字符串映射到目标对象自己的(可枚举)属性键。如果目标不是对象,则在ES5中抛出TypeError,但将非对象目标强制为ES2015中的对象 | N/A |
| ownKeys() | N/A | Reflect.ownKeys()返回一个属性名称数组,该属性名称映射到目标对象自己的属性键,如果目标不是Object,则抛出TypeError。 |