ES6检测功能是否在类实例的原型链上

时间:2018-09-02 15:05:57

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

给出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

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

链接相关问题:

2 个答案:

答案 0 :(得分:0)

一个选项可能是:

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

答案 1 :(得分:0)

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

如果实际功能不同,这还将添加其他检查。