Reflect

Reflect

  • 将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上
  1. Reflect.get(target,name,receiver)
  • Reflect.get方法查找并返回target对象的name属性,如果没有该属性,则返回undefined
  • 如果name属性部署了getter,则getter函数的this绑定receiver
const objectReceiver = {
  foo:5,
  bar:12
}

const targetObject = {
  foo:1,
  bar:3,
  get foo(){
    return this.foo + this.bar
  }
}

Reflect.get(targetObject,'foo',objectReceiver) // 17
  1. Reflect.set(target,key,value,receiver)
  • Reflect.set方法设置target对象的name属性等于value
  • 如果name属性设置了赋值函数,则赋值函数的this绑定receiver。
  • 如果 Proxy对象和 Reflect对象联合使用,前者拦截赋值操作,后者完成赋值的默认行为,而且传入了receiver,那么Reflect.set会触发Proxy.defineProperty拦截。
const target = {
  a:'a'
}
const handler = {
  set(target,key,value,receiver){
    // 方式1:
    Reflect.set(target,key,value)  // 只改变实例,不会触发defineProperty

    // 方式2:
    Reflect.set(target,key,value,receiver) // 传入receiver(指向Proxy实例),会触发defineProperty函数


    // 注: set get 优先级比 defineProperty 高
  },
  defineProperty(){
    console.log('触发difineProperty')
  }
}

const proxy = new Proxy(target,handler) 
proxy.a = 'A'
console.log(proxy)
// 方式一:{a:'a'}
// 方式二:{a:'A'}
  1. Reflect.has(obj,name)
  • Reflect.has方法对应name in obj里面的in运算符。判断对象中是否含有该属性,返回布尔值
  1. Reflect.deleteProperty(obj,name)
- Reflect.deleteProperty方法等同于delete obj[name],用于删除对象的属性
  1. Reflect.construct(target,args)
- Reflect.construct方法等同于new target(...args),这提供了一种不使用new,来调用构造函数的方法
```js
function Greeting(name){
  this.name = name
}

const greet = Reflect.construct(Greeting,['zhang'])
// 相当于 new Greeting('zhang')
```
  1. Reflect.getPrototypeOf(obj)
- Reflect.getPrototypeOf方法用于读取对象的__proto__属性,对应Object.getPrototypeOf(obj)
  1. Reflect.setPrototypeOf(obj,newProto)
- Reflect.setPrototypeOf方法用于设置目标对象的原型(prototype),对应Object.setPrototypeOf(obj, newProto)方法。它返回一个布尔值,表示是否设置成功
```js
// Reflect.setPropotypeOf()  -->  将现有对象的原型修改为另一对象
// Object.create()   -->  创建对象,将现有对象作为原型
```
  1. Reflect.apply(func, thisArg, args)
- Reflect.apply方法等同于Function.prototype.apply.call(func, thisArg, args),用于绑定this对象后执行给定函数
- 如果要绑定一个函数的this对象,可以这样写fn.apply(obj, args),但是如果函数定义了自己的apply方法,就只能写成Function.prototype.apply.call(fn, obj, args)
  1. Reflect.defineProperty(target,propertyKey,descriptor)
- 同 Object.defineProperty
  1. Reflect.getOwnPropertyDescriptor(target, key)
- 用于得到指定属性的描述对象
```js
const myObj = {};
Object.defineProperty(myObj, 'hidden', {
  value: true,
});
const a = Reflect.getOwnPropertyDescriptor(myObj, 'hidden');
console.log(a) 
// {
//   configurable: true
//   enumerable: true
//   value: true
//   writable: true
//}
```
  1. Reflect.isExtensible (target)
- 表示当前对象是否可扩展  (可扩展性: 是否可以给对象添加新属性)
  1. Reflect.preventExtensions(target)
- 用于让一个对象变为不可扩展
  1. Reflect.ownKeys(target)
- 返回对象的所有属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值