ES6新API之Reflect对象:设计目的与方法特性解析

托福2025-09-03 21:11:14佚名

[]

该实体与代理类似,也是 ES6 为处理对象而新增的一种机制。它的构建意图包含多个方面。

Reflect对象用法_reflect是什么意思_Reflect与Proxy关系

将对象的部分显著属于语言体系的方法(诸如点号操作),迁移至对象本身,当前某些方法既在对象上存在,也部署在语言核心,往后新增的方法将仅部署在对象层面,换言之,对象本身能够获取语言体系内的方法。

调整部分函数的输出,使其更为恰当。举例来说reflect是什么意思留学之路,当尝试设定某个属性却无法成功时,一个函数会触发异常,而另一个函数则会产生一个假值。

Reflect对象用法_Reflect与Proxy关系_reflect是什么意思

  1. // 老写法
  2. try {
  3. Object.defineProperty(target, property, attributes);
  4. // success
  5. } catch (e) {
  6. // failure
  7. }
  8. // 新写法
  9. if (Reflect.defineProperty(target, property, attributes)) {
  10. // success
  11. } else {
  12. // failure
  13. }

让所有操作都以函数形式执行。部分操作具有指令式特征,例如name属于obj以及obj,而.has(obj, name)和.(obj, name)则将它们转化为函数调用方式。

  1. // 老写法
  2. 'assign' in Object // true
  3. // 新写法
  4. Reflect.has(Object, 'assign') // true

Reflect对象用法_reflect是什么意思_Reflect与Proxy关系

对象上的方法与Proxy对象的方法逐项匹配,只要Proxy对象拥有某个方法,那么在对象中也必然存在相应的方法。这种对应关系使得Proxy对象能够便捷地调用对象中的方法,以实现预设的默认操作,并为后续的行为调整提供依据。换句话说,即便Proxy对象对默认行为进行了调整,依然可以从对象中检索到原始的默认行为。

  1. Proxy(target, {
  2. set: function(target, name, value, receiver) {
  3. var success = Reflect.set(target, name, value, receiver);
  4. if (success) {
  5. console.log('property ' + name + ' on ' + target + ' set to ' + value);
  6. }
  7. return success;
  8. }
  9. });

那个代码里的Proxy方法会阻拦对象属性值的更改动作。它借助.set技术把数值安放到对象属性之中,务必要让原本的动作得以实现,随后再附加其他作用。

下面是另一个例子。

Reflect与Proxy关系_reflect是什么意思_Reflect对象用法

  1. var loggedObj = new Proxy(obj, {
  2. get(target, name) {
  3. console.log('get', target, name);
  4. return Reflect.get(target, name);
  5. },
  6. deleteProperty(target, name) {
  7. console.log('delete' + name);
  8. return Reflect.deleteProperty(target, name);
  9. },
  10. has(target, name) {
  11. console.log('has' + name);
  12. return Reflect.has(target, name);
  13. }
  14. });

上述代码里,所有Proxy对象的拦截动作,比如获取、检查属性等reflect是什么意思,都通过对应的方法实现,确保原始功能不受影响。现在需要做的,是为每个操作打印一条记录信息。

Reflect对象用法_reflect是什么意思_Reflect与Proxy关系

有了对象以后,很多操作会更易读。

  1. // 老写法
  2. Function.prototype.apply.call(Math.floor, undefined, [1.75]) // 1
  3. // 新写法
  4. Reflect.apply(Math.floor, undefined, [1.75]) // 1

相关推荐

猜你喜欢

大家正在看

换一换