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

ES6 detect if a function is on prototype chain of a class instance

给定一个 ES6 class:

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

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

链接相关问题:

一个选项可能是:

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

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