什么是Reflect?为什么需要Reflect?有哪些目的和静态方法?

什么是Reflect?为什么需要Reflect?有哪些目的和静态方法?

与大多数全局对象不同,

Reflect不是一个构造函数。

不能将其与一个new运算符一起使用,

不能将Reflect对象作为一个函数来调用。

Reflect的所有属性和方法都是静态的。

Reflect对象的设计目的有这样几个:

(1) 将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect对象上。也就是说,从Reflect对象上可以拿到语言内部的方法。

(2) 修改某些Object方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false。

(3) 让Object操作都变成函数行为。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)让它们变成了函数行为。

(4)Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。

Reflect对象提供以下静态函数

Reflect.apply()

对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和 Function.prototype.apply() 功能类似。

Reflect.construct()

对构造函数进行 new 操作,相当于执行 new target(...args)。

Reflect.defineProperty()

和 Object.defineProperty() 类似。

Reflect.deleteProperty()

作为函数的delete操作符,相当于执行 delete target[name]。

Reflect.get()

获取对象身上某个属性的值,类似于 target[name]。

Reflect.getOwnPropertyDescriptor()

类似于 Object.getOwnPropertyDescriptor()。

Reflect.getPrototypeOf()

类似于 Object.getPrototypeOf()。

Reflect.has()

判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。

Reflect.isExtensible()

类似于 Object.isExtensible().

Reflect.ownKeys()

返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys(), 但不会受enumerable影响).

Reflect.preventExtensions()

类似于 Object.preventExtensions()。返回一个Boolean。

Reflect.set()

将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。

Reflect.setPrototypeOf()

类似于 Object.setPrototypeOf()。


分享到:


相關文章: