reflect存在的意义和使用api

es6提供了一个全新的api----reflectl,reflect和proxy是相对的,我们可以用reflect操作对象。

reflect存在的意义:

1,将object对象一些内部的方法,放到Reflect对象上。比如:object.defineProperty

说明:现阶段这些方法存在于object和Reflect对象上,未来只存在于Reflect对象上。

意义:也就是说,从Reflect对象上可以拿到语言内部的方法。

2,操作对象时出现报错返回false

说明:比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false

// 老写法
try {
  Object.defineProperty(target, property, attributes);
  // success
} catch (e) {
  // failure
}

// 新写法
if (Reflect.defineProperty(target, property, attributes)) {
  // success
} else {
  // failure
}

 

3,让操作对象的编程变为函数式编程

说明:老写法有的是命令式编程,比如下面这个例子

// 老写法
'assign' in Object // true

// 新写法
Reflect.has(Object, 'assign') // true

4,保持和proxy对象的方法一一对应

说明:Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。

Proxy(target, {
  set: function(target, name, value, receiver) {
    var success = Reflect.set(target, name, value, receiver);
    if (success) {
      console.log('property ' + name + ' on ' + target + ' set to ' + value);
    }
    return success;
  }
});

总结:综上所述,Reflect对象有4个意义:

  • Reflect对象上可以拿到语言内部的方法。
  • 操作对象出现报错时返回false
  • 让操作对象都变为函数式编程
  • 保持和proxy对象的方法一一对象

Reflect常用api:

静态方法:

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)

以上方法具体实现请自行google

实例:观察者实例实现:

const queuedObservers = new Set();

const observe = fn => queuedObservers.add(fn);
const observable = obj => new Proxy(obj, {set});

function set(target, key, value, receiver) {
  const result = Reflect.set(target, key, value, receiver);
  queuedObservers.forEach(observer => observer());
  return result;
}

 

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值