Shaoli's Blog

es6的 Reflect对象 学习

Reflect对象其实就是为了取代Object对象


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;
}



    评论列表

  • 暂无评论...快来说说吧!
person
0 / 16
comment
0 / 100