Reflect也是ES6为了操作对象而提供的新API。Reflect是一个内置的对象,它提供拦截JavaScript操作的方法,这些方法与处理器对象的方法相同。它不是一个函数对象,所以不可构造。同时Reflect的所有属性和方法都是静态。
Reflect对象的设计目的有这几个:
目前,某些方法同时在Object和Reflect对象上部署,未来的新方法将值部署在Reflect对象上
Object.defineProperty(obj, name, desc)
在无法定义属性时会抛出错误,而Reflect.defineProperty(obj, name, desc)
返回false)name in obj
和 delete obj[name]
,Reflect中使用Reflect.has(obj, name)
和Reflect.deleteProperty(obj, name)
)Object与Reflect的差别:
Object | Reflect | |
---|---|---|
遭遇错误的结果 | 报错 | 返回false |
操作 | 命令式语句 | 函数行为 |
Reflect对象的方法都是静态方法。与Proxy对象中的handler对象的函数类似但要有所区别。
对义工函数进行调用操作,同时可以传入一个数组作为调用参数。和Function.prototype.apply()功能相似。
target:目标函数
thisArgument:target函数调用时绑定的this对象
argumentsList:target函数调用时传入的实参列表,该参数应该是一个类数组的对象。
如果target对象不可调用,会抛出TypeError。
对构造函数进行new操作,相当于执行new target(...args)
。返回以target函数为构造函数,argumentsList为初始化参数的对象实例。
target:被运行的目标构造函数
argumentsList:类数组,目标构造函数调用时的参数。
newTarget:可选,新创建对象的原型对象,参考new.target操作符,默认值为target
如果target或者new Target不是构造函数,那么会抛出TypeError。
基本等同于Object.defineProperty()方法,唯一不同是返回Boolean值。表示属性是否被成功定义。
target:目标对象
propertyKey:要定义或修改的属性的名称。
attributes:要定义或修改的属性的描述。
如果target不是Object,会抛出TypeError。
作为函数的delete操作符,相当于执行delete target[name]
。返回一个Boolean表示是否被成功删除。
target:目标对象
propertyKey:需要删除的属性的名称。
如果target不是Object的话,抛出TypeError。
获取目标对象身上某个属性的值,类似于target[name].。返回属性的值,若没有则返回undefined。
target:目标对象
propertyKey:需要获取的值的键名
receiver:若target对象中指定了getter,receiver则为getter调用时的this值
如果目标值非Object,则抛出TypeError
与Object.getOwnPropertyDescriptor()方法相似,返回给定对象的自身属性的属性描述符,非原型链中的属性。返回对应的描述符对象,否则返回undefined。
obj:目标对象
prop:要获取描述符的属性的名称或者对应的Symbol类型。
如果target不是Object类型,会抛出一个TypeError
返回指定对象的原型(内部的[[Prototype]])。与Object.getPrototypeOf()一样。返回给定对象的原型,如果没有继承的属性则返回null
target:目标对象
如果target不是Object类型,则抛出TypeError
判断对象中是否存在对应的键。返回一个Boolean表示是否存在这个属性
target:目标对象
propertyKey:键名
如果target不是Object类型,则抛出TypeError
判断一个对象是否可扩展,与Object.isExtensible()类似,但是,当第一个参数不是对象时,该函数会抛出TypeError,而Object.isExtensible()则会将第一个参数强制转换为一个对象。
该函数返回一个Boolean值表示目标对象是否可扩展。
Reflect.isExtensible(1);
//result: Uncaught TypeError: Reflect.isExtensible called on non-object
Object.isExtensible(1);
//result: false
target:目标对象
如果target不是Object类型,则抛出TypeError
返回一个包含自身所有属性键,不包含继承属性,的数组。类似于Object.keys(),但是不受enumerable影响。
target:目标对象
其返回值相当于
Object.getOwnPropertyNames(target)
.concat(
Object.getOwnPropertySymbols(target)
)
如果target不是Object类型,则抛出TypeError
阻止新属性添加到对象。与Object.preventExtensions()相似。当第一个参数不是对象时,该函数会抛出一个TypeError,而Object.preventExtensions()会将其强制转换成对象。
Reflect.preventExtensions(1);
//result: Uncaught TypeError: Reflect.preventExtensions called on non-object
Object.preventExtensions(1);
//result: false
如果target不是Object类型,则抛出TypeError
将值分配给属性的函数。返回一个Boolean,表示更新成功与否。
target:目标对象
propertyKey:需要设置的属性名称
value:设置的值
receiver:可选,setter函数中的this值
如果target不是Object类型,则抛出TypeError
设置原型为一个新的原型对象或者是让其为null,与Object.setPrototypeOf()相似,区别在于返回值的不同。返回一个Boolean表示设置是否成功。
target:目标对象
prototype:设置值,对象或者是为null
如果target不是一个对象,或者设置的值不是一个对象也不是null,则会抛出TypeError。
函数 | 区别点 | Object | Reflect |
---|---|---|---|
isExtensible() preventExtensions() |
第一个参数不是一个对象 | 强制转为对象 | 抛出TypeError |
获取属性键 | 是否受enumerable | Object.keys() 受影响 |
Reflect.ownKeys() 不受影响 |
defineProperty() | 返回值 | 成功:返回一个对象 失败,即属性没有被成功定义:抛出TypeError |
返回一个Boolean表示成功与否 |
参考资料:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect
http://caibaojian.com/es6/proxy.html