文章目录
- 简单说明
- Reflect对象的方法
-
- Reflect.apply(target, thisArgument, argumentsList)
- Reflect.construct(target, argumentsList[, newTarget])
- Reflect.defineProperty(target, propertyKey, attributes)
- Reflect.deleteProperty(target, propertyKey)
- Reflect.get(target, propertyKey[, receiver])
- Reflect.getOwnPropertyDescriptor(obj, prop)
- Reflect.getPrototypeOf(target)
- Reflect.has(target, propertyKey)
- Reflect.isExtensible(target)
- Reflect.ownKeys(target)
- Refledct.preventExtensions()
- Reflect.set(target, propertyKey, value[, receiver])
- Reflect.setPrototypeOf(target, prototype)
- 与Object的方法的区别整合
简单说明
Reflect也是ES6为了操作对象而提供的新API。Reflect是一个内置的对象,它提供拦截JavaScript操作的方法,这些方法与处理器对象的方法相同。它不是一个函数对象,所以不可构造。同时Reflect的所有属性和方法都是静态。
Reflect对象的设计目的有这几个:
- 将Object对象的一些明显属于语言内部的方法,放到Reflect对象上。
目前,某些方法同时在Object和Reflect对象上部署,未来的新方法将值部署在Reflect对象上
- 修改某些Object方法的返回结果,让其变得更合理。(比如,
Object.defineProperty(obj, name, desc)
在无法定义属性时会抛出错误,而Reflect.defineProperty(obj, name, desc)
返回false) - 让Object操作都变成函数行为。
比如name in obj
和delete obj[name]
,Reflect中使用Reflect.has(obj, name)
和Reflect.deleteProperty(obj, name)
) - Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。可以使Proxy对象更方便地调用对应的Reflect方法,完成默认行为。
Object与Reflect的差别:
Object | Reflect | |
---|---|---|
遭遇错误的结果 | 报错 | 返回false |
操作 | 命令式语句 | 函数行为 |
Reflect对象的方法
Reflect对象的方法都是静态方法。与Proxy对象中的handler对象的函数类似但要有所区别。
Reflect.apply(target, thisArgument, argumentsList)
对义工函数进行调用操作,同时可以传入一个数组作为调用参数。和Function.prototype.apply()功能相似。
target:目标函数
thisArgument:target函数调用时绑定的this对象
argumentsList:target函数调用时传入的实参列表,该参数应该是一个类数组的对象。
异常
如果target对象不可调用,会抛出TypeError。
Reflect.construct(target, argumentsList[, newTarget])
对构造函数进行new操作,相当于执行new target(...args)
。返回以target函数为构造函数,argumentsList为初始化参数的对象实例。
target:被运行的目标构造函数