【问题标题】:ES6 detect if a function is on prototype chain of a class instanceES6 检测函数是否在类实例的原型链上
【发布时间】:2019-02-07 19:56:31
【问题描述】:

给定一个 ES6 类:

class C {
  x () { }
  fnIsMethodOfC (fn) { return /* ? */ }
}

还有多种功能如

function y () {}
z = () => {}

是否有一种有效的方法来确定函数是否是 C 的方法,即

c = new C()
c.fnIsMethodOfC(c.x) === true
c.fnIsMethodOfC(C.prototype.x) === true
c.fnIsMethodOfC(y) === false
c.fnIsMethodOfC(z) === false

我知道可以递归循环遍历原型链,但这将是一项昂贵的操作。

链接相关问题:

【问题讨论】:

  • 您只想检查类实现自身的函数还是原型链中的所有函数?
  • 如果名称匹配足够可以Object.getOwnPropertyNames( C.prototype ).includes(fn.name).
  • @LucaKiebel 一个理想的答案是检查链,但一个合适的开始就是类实现的内容。
  • 如果您不知道方法名称,那么您将不得不搜索它。
  • "可以递归循环遍历原型链,但这将是一项昂贵的操作。" - 你为什么这么认为?

标签: javascript function ecmascript-6 prototype es6-class


【解决方案1】:

一个选项可能是:

class C {
  fnIsMethodOfC (fn) {
    const proto = Object.getPrototypeOf(this)
    return proto && proto[fn.name] === fn
  }
}

【讨论】:

  • fn.name 可能适用于在 class 中声明的方法,但通常不适用于所有方法。
  • @Bergi 是的,一个更好的答案将是全面的。
【解决方案2】:
class C {
  fnIsMethodOfC (fn) {
    if(!fn || !fn.name) return false;
    return !!this[fn.name] && fn === this[fn.name];
  }
}

如果实际功能不同,这还将添加额外的检查。

【讨论】:

  • 修复它.. 它应该是 fn.name
猜你喜欢
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2019-03-31
  • 2019-02-03
  • 2014-06-03
  • 2011-08-09
  • 1970-01-01
  • 2018-05-25
相关资源
最近更新 更多