Reflect
对象与 Proxy
对象一样,也是 ES6
为了操作对象而提供的新 API
简单来说两点,一个就是将 Object
对象的一些明显属于语言内部的方法(比如 Object.defineProperty
),放到 Reflect
对象上,另一个就是让 Object
操作都变成函数行为,因为 ES5
很多 Object
操作都是命令式的(另外一个原因就是这些方法可能是全局的,或者要通过原型来调用,统一起来),这里只简单的介绍几个常用的方法,详细的可见 ECMAScript 6 入门 和 Reflect - MDN
Reflect.apply(target, thisArgument, argumentsList)
与 ES5
的 Function.prototype.apply
方法是类似的,比如查找数组中最大数
1 | // ES5 |
切割字符串
1 | // ES5 |
Reflect.construct(target, argumentsList[, newTarget])
与使用 new target(...args)
方法类似,相当于提供了一种新的不使用 new
来调用构造函数的方法
target
表示被运行的目标函数argumentsList
调用构造函数传递的参数数组或者伪数组newTarget
参数为构造函数,表示使用Reflect.construct
后生成的对象是谁的实例- 如果没有传递第三个参数,默认和
target
一样
如果没有传递第三个参数,那么 target
就是唯一的构造函数,但是如果传递了第三个参数,那就表示实例将由两部分组成,实例的属性部分(constructor
)由第一个参数生成,实例的方法部分由第三个参数生成
1 | class A1 { |
Reflect.defineProperty(target, propertyKey, attributes)
与 Object.defineProperty
相似,不过如果 Object.defineProperty
的属性定义失败了,就会抛出一个错误,而 Reflect.defineProperty
如果定义属性失败的话就会返回 false
1 | let obj = {} |
Reflect.getPrototypeOf(target)
与 Object.getPrototypeOf
方法是一样的,都是返回一个对象的原型,也就是内部的 [[Prototype]]
属性的值,如果要获取原型的那个值不是一个对象,那么函数 Reflect.getPrototypeOf
会抛出一个异常,对于给定对象的原型,如果没有继承的属性,则返回 null
Reflect.ownKeys(target)
返回由目标对象自身的属性键组成的数组,包括 Symbol
的值
1 | let a = Symbol.for('a') |