Reflect 映射

Reflect 映射

1. Reflect 映射

Reflect对象与 Proxy 对象一样,也是 ES6 为了操作对象而提供的新 API

Reflect 是一个内置的对象,而不是一个函数对象,因此它是不可构造的

Reflect 作用:

  • 优化 Object 的一些操作方法以及合理的返回 Object 操作返回的结果
  • Proxy 在拦截访问目标对象,或者对代理对象操作都是通过 Reflect 映射来完成
let obj = {
   
  name: 'jsx'
};
// 获取对象属性
console.log(Reflect.ownKeys(obj)); // ['name']

// 结合Proxy使用
let proxy = new Proxy(obj, {
   
  get(target, prop, receiver) {
   
    return Reflect.get(target, prop, receiver);
  },
  set(target, prop, value, receiver) {
   
    return Reflect.set(target, prop, value, receiver)
  }
})
console.log(proxy.name); // jsx
console.log(proxy.title = 'Reflect映射'); // Reflect映射

2. Reflect 静态方法

对于每个可被 Proxy 捕获的内部方法,在 Reflect 中都有一个对应的方法,其名称和参数与 Proxy 捕捉器相同

Proxy 对象可以方便地调用对应的 Reflect 方法,完成默认行为,作为修改行为的基础。也就是说,不管Proxy怎么修改默认行为,你总可以在Reflect上获取默认行为

2-1 Reflect.get

Reflect.get(target, name, receiver)

  • Reflect.get方法查找并返回target对象的name属性,如果没有该属性,则返回undefined
  • 如果name属性部署了读取函数 get(),则读取函数的this绑定receiver
  • 如果第一个参数不是对象,Reflect.get方法会报错``
// Reflect.get(target, name, receiver) 返回target对象的name属性
let myobj = {
   
	name: 'jsx',
	age: 22,
	get info() {
   
		return this.name + ' ' + this.age
	}
}
console.log(Reflect.get(myobj, 'name')) // jsx
// 没有属性返回undefined
console.log(Reflect.get(myobj, 'names')); // undefined
// 设置 get()函数后 this 指向第三个参数 receiver
let receiver = {
   
	name: 'ljj',
	age: 23
}
console.log(Reflect.get(myobj, 'info', receiver)); // ljj 23

// 第一个参数必须是对象,否则报错
// console.log(Reflect.get(true, 'name')) Uncaught TypeError

2-2 Reflect.set

Reflect.set(target, name, value, receiver)

  • Reflect.set方法设置target对象的name属性等于value

  • 如果name属性设置了赋值函数,则赋值函数的this绑定receiver

  • 如果第一个参数不是对象,Reflect.set会报错

// Reflect.set(target, name, value, receiver)
// 设置target对象的name属性等于value 返回布尔值
let myobj = {
   
	name: 'jsx',
	age: 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值