Javascript ES6检测函数是否在类实例的原型链上

Javascript ES6检测函数是否在类实例的原型链上,javascript,function,ecmascript-6,prototype,es6-class,Javascript,Function,Ecmascript 6,Prototype,Es6 Class,给定ES6等级: class C { x () { } fnIsMethodOfC (fn) { return /* ? */ } } 以及多种功能,如 function y () {} z = () => {} 有没有一种有效的方法来确定一个函数是否是C.e c = new C() c.fnIsMethodOfC(c.x) === true c.fnIsMethodOfC(C.prototype.x) === true c.fnIsMethodOfC(y) === false

给定ES6等级:

class C {
  x () { }
  fnIsMethodOfC (fn) { return /* ? */ }
}
以及多种功能,如

function y () {}
z = () => {}
有没有一种有效的方法来确定一个函数是否是C.e

c = new C()
c.fnIsMethodOfC(c.x) === true
c.fnIsMethodOfC(C.prototype.x) === true
c.fnIsMethodOfC(y) === false
c.fnIsMethodOfC(z) === false
我知道可以递归地循环原型链,但这将是一个昂贵的操作

链接相关问题:

一个选项可能是:

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

如果实际函数不同,这还将添加附加检查。

您只想检查类自身实现的函数还是原型链中的所有函数?如果名称匹配足够,则可以执行
Object.getOwnPropertyNames(C.Prototype).includes(fn.name)
@LucaKiebel理想的答案是检查链,但是一个合适的开始应该是类实现的。如果你不知道方法名称,那么你就不必搜索它。“可以递归地循环原型链,但这将是一个昂贵的操作。”-你为什么这么认为呢?
fn.name
可能适用于
类中声明的方法,但并非所有方法都适用。@Bergi是的,更好的答案应该是全面的。修复了它。。应该是fn.name
class C {
  fnIsMethodOfC (fn) {
    if(!fn || !fn.name) return false;
    return !!this[fn.name] && fn === this[fn.name];
  }
}