【问题标题】:Trapping class definition via Proxy in ES6在 ES6 中通过 Proxy 捕获类定义
【发布时间】:2017-01-15 19:22:46
【问题描述】:

是否可以捕获extends?或者在一个类中捕获定义?例如:

class B extends A {
    method1( ) { }
    static method2( ) { }
}


有什么方法可以捕获以下事件:

  • B 扩展A
  • method1( )B.prototype 上定义
  • method2( ) 是在 B 上定义的。


现有的机制似乎都不起作用。尝试了setPrototypeOfdefineProperty 陷阱。

【问题讨论】:

  • 你想把这些东西困在哪里? B 在某一时刻不存在,而在另一时刻已经定义。解释你的情况可能会有所帮助。
  • 你真正想通过捕获extend来解决什么问题?我猜可能还有其他我们可以提供帮助的解决方法。
  • 用例类似于为什么要捕获defineProperty:在对象上定义某些内容时自动运行代码。由于没有触发defineProperty 陷阱,我正在检查是否可以捕获extends。否则,我没有 extends 陷阱的强大用例。

标签: ecmascript-6 metaprogramming es6-class es6-proxy


【解决方案1】:

B 类扩展A 类时,它会得到它的prototype 对象。因此,您可以在get 上定义一个带有陷阱的代理,并检查正在访问的属性是否为"prototype"

class A {}

PA = new Proxy(A, {
  get(target, property, receiver) {
    console.log('get', property)
    if (property == 'prototype')
      console.info('extending %o, prototype=%s', target, target.prototype)
    return target[property]
  }
})

class B extends PA {}

【讨论】:

  • @Gubbi 请注意,原型可以在其他情况下访问,所以要小心,也许您需要根据您的用例进一步检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 2018-07-14
  • 2016-11-13
相关资源
最近更新 更多