比较 Reflect 和 Object 方法

ES2015中引入的 Reflect 对象是一个内置对象,提供了与JavaScript对象交互的方法。Reflect 上存在的一些静态函数也对应于ES2015之前的Object上可用的方法。尽管某些方法在行为上看似相似,但它们之间常常存在细微的差异。

下表详细介绍了Object 和 Reflect API上可用方法之间的差异。请注意,如果API中不存在某种方法,则将其标记为N/A。

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,但在ES2015中强制为非对象。

Reflect.getPrototypeOf()返回给定对象的原型。如果没有继承的原型,则返回null,并为非对象抛出TypeError

setPrototypeOf()

如果对象的原型设置成功,则Object.setPrototypeOf()返回对象本身。如果设置的原型不是Objectnull,或者被修改的对象的原型不可扩展,则抛出TypeError

如果在对象上成功设置了原型,则Reflect.setPrototypeOf() 返回true,否则返回false(包括原型是否不可扩展)。如果传入的目标不是Object,或者设置的原型不是Objectnull,则抛出TypeError

isExtensible()

如果对象是可扩展的,则Object.isExtensible()返回true,否则返回false。如果第一个参数不是对象(原始值),则在ES5中抛出TypeError。在ES2015中,它将被强制为不可扩展的普通对象并返回false

如果对象是可扩展的,则Reflect.isExtensible() 返回true,否则返回false。如果第一个参数不是对象(原始值),则抛出TypeError

preventExtensions()

Object.preventExtensions() 返回被设为不可扩展的对象。如果参数不是对象(原始值),则在ES5中抛出TypeError。在ES2015中,参数如为不可扩展的普通对象,然后返回对象本身。

returns true if the object has been made non-extensible, and false if it has not. Throws a TypeError if the argument is not an object (a primitive).

如果对象已变得不可扩展,则Reflect.preventExtensions() 返回true,否则返回false。如果参数不是对象(原始值),则抛出TypeError

keys()

Object.keys()返回一个字符串数组,该字符串映射到目标对象自己的(可枚举)属性键。如果目标不是对象,则在ES5中抛出TypeError,但将非对象目标强制为ES2015中的对象

N/A
ownKeys() N/A

Reflect.ownKeys()返回一个属性名称数组,该属性名称映射到目标对象自己的属性键。如果目标不是Object,则抛出TypeError