reflect 对象和proxy对象一样, 为操作对象提供了新的api。
将 object 对象上一些明显属于内部的方法放到 reflect对象上。比如 object.defindproperty
也可以使用 reflect.defindproperty
修改某些 object 方法的返回结果
让 object 操作都变成函数行为。
reflect 对象的操作方法和 proxy的方法一一对应, 很方便 proxy对象来调用 reflect 方法
例子:
const sum = function (num1, num2) { return num1 + num2 } const proxy = new proxy(sum, { apply(target, context, args) { return reflect.apply(...arguments) * 2 } }) proxy(1,2) // 6
以上代码 proxy 的配置方法 apply和 reflect的apply方法是对应关系,直接通过 reflect.apply
来调用拦截函数 sum
。并将函数执行后的结果 * 2。最终的结果是 6。
#### reflect 对象和 proxy的静态方法一样,同样是13个。
target
: 查找的对象
key
: 查找的属性
context
: 读取getter函数的上下文对象
const obj = { name: 'qiqingfu', get sayname() { console.log(this.name) } } const obj1 = { name: 'zhangfei' } reflect.get(obj, 'name') // qiqingfu reflect.get(obj, 'sayname', obj1) // zhangfei
如果第一个参数不是对象, reflect.get
方法会报错。
target
: 要给哪个对象设置
key
: 要设置的属性
value
: 设置的值
返回值
: boolean
const obj = { value: 1, set fn(newvalue) { return this.value = newvalue } } console.log(reflect.set(obj, 'name', 'qiqingfu')) // true console.log(reflect.set(obj, 'fn', 2)) console.log(obj)
以上代码,给obj对象设置了一个name
属性,其值为qiqingfu
, 并且设置fn
的时候被get
函数拦截到了。
返回值
: boolean
const obj = { name: 'qiqingfu', a: 2 } console.log(reflect.has(obj, 'name')) // true console.log(reflect.has(obj, 'a')) // true console.log(reflect.has(obj, 'b')) // false
其实 reflect.has
和 in
操作符类似。
target
: 目标函数
args
: 实例化对象需要传递的参数 array
返回值
: 实例对象
function prosen (name, age) { this.name = name; this.age = age } const prosen = reflect.construct(prosen, ['qiqingfu', 22]) // {name: 'qiqingfu', age: 22}
以上代码使用 reflect.construct
方法实例话一个对象,接受的参数为数组类型
更推崇使用前者。
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
const obj = { } reflect.defineproperty(obj, 'a', { value: 1, configurable: true, // 可配置 writable: true // 可写 }) // {a: 1}
以上代码给 obj 对象添加了一个 a属性, 其值为1并且是可配置和可修改的
const obj = { a: 1 } reflect.defindproperty(obj, 'a') console.log(obj) // {}
function prosen() { } prosen.prototype.age = 21 const prosen = reflect.construct(prosen, []) // 获取原型对象的属性 const proto = reflect.getprototypeof(prosen) console.log(proto) // {age: 21, constructor: ƒ}
以上代码 给 prosen 构造函数的原型对象上添加了一个 age属性。并且通过 reflect.construct
方法实例化一个对象。那么就可以通过 reflect.getprototypeof
方法获取一个对象的原型对象。
function prosen() { } prosen.prototype.age = 21 const prosen = reflect.construct(prosen, []) // 设置prosen 的原型对象 reflect.setprototypeof(prosen, {b: 2})
此时, prosen的原型对象为 {b:2}, 而 construct
指针会被覆盖
和 object.ownkeys
相同。
const obj = { a: 1, [symbol('c')]: 3, } reflect.defineproperty(obj, 'b', { value: 2, configurable: true, enumerable: true }) console.log(reflect.ownkeys(obj)) // ["a", "b", symbol(c)]
返回值是一个数组, 存放着对象的 key值的集合。
返回值
: object
const obj = { a: 1, [symbol('c')]: 3, } reflect.defineproperty(obj, 'b', { value: 2, configurable: true, enumerable: true }) const decs = reflect.getownpropertydescriptor(obj, 'b') console.log(decs) /* {value: 2, writable: false, enumerable: true, configurable: true} */
以上代码通过 reflect.getownpropertydescriptor
方法获取一个对象属性的描述对象, 如果第一个参数不是对象会报错。而在 object.getownpropertydescriptor
不会报错,只不过返回 undefind
如对本文有疑问, 点击进行留言回复!!
Android 入门第七讲01-数据存储(数据存储概述,文件存储(raw和asserts目录读写,data/data/包名目录读写,sdcard目录读写),SharedPreferences读写)
vue-axios系列:axios拦截器,配置请求头,配置请求参数
Vuejs 针对 安卓低版本 、ios9.x 不兼容 ES6语法导致失效解决方法
网友评论