文章目录
Reflect
1.0 概述
Reflect
对象与Proxy
对象一样, 也是ES6为了操作对象而提供的新 API,Reflect
对象的设计目的有这样几个.
- 将
Object
对象的一些明显属于语言内部的语法(比如Object.defineProperty
) 放到Reflect
对象上. 也就是说, 可以从Reflect
对象上拿到语言内部的方法.- 修改某些
Object
方法的返回结果, 让其变得更合理. 比如Object.defineProperty(obj, name, desc)
在无法定义属性时, 会抛出一个错误, 而Reflect.defineProterty(obj,name, desc)则返回
false`// 老写法 try { Object.defineProperty(target, property, attributes); // success } catch (e) { // failure } // 新写法 if (Reflect.defineProperty(target, property, attributes)) { // success } else { // failure }
让
Object
操作都变成函数行为, 某些Object
操作时命令式, 比如name in obj
和delete obj[name]
, 而reflect.has(obj,name)
和Reflect.deleteProperty(obj,name)
让它们变成了函数行为.const obj = { name: 'Gene', } // 老写法 console.log('name' in obj); // 新写法 Reflect.has(obj, 'name')
Reflect
对象的方法与Proxy
对象的方法一一对应, 只要是Proxy
对象的方法, 就能在Reflect
对象上找到对应的方法. 这就让Proxy
对象可以方便的调用对应的Reflect
方法, 完成默认行为, 作为修改行为的基础, 也就是说, 不管Proxy
怎么修改默认行为, 你总是可以在Reflect
上获取默认行为.
2.0 静态方法
Reflect
对象一共有 13 个静态方法.
- Reflect.apply(target, thisArg, args)
- Reflect.construct(target, args)
- Reflect.get(target, name, receiver)
- Reflect.set(target, name, value, receiver)
- Reflect.defineProperty(target, name, desc)
- Reflect.deleteProperty(target, name)
- Reflect.has(target, name)
- Reflect.ownKeys(target)
- Reflect.isExtensible(target)
- Reflect.preventExtensions(target)
- Reflect.getOwnPropertyDescriptor(target, name)
- Reflect.getPrototypeOf(target)
- Reflect.setPrototypeOf(target, prototype)
2.1 Reflect.get(target,name,receiver)
Reflect.get
方法查找并返回target
对象的name
属性, 如果没有该name
属性, 则返回undefined
const obj = { name: 'Gene', age: 18, get baz() { return this.name + '-' +