Учитывая класс 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
Я знаю, что можно пройти рекурсивный цикл по цепочке прототипов, но это будет дорогостоящей операцией.
Связывание связанных вопросов:
class C { fnIsMethodOfC (fn) { if(!fn || !fn.name) return false; return !!this[fn.name] && fn === this[fn.name]; } }
Это также добавит дополнительную проверку, если фактическая функция отличается.
Один из вариантов может быть:
class C { fnIsMethodOfC (fn) { const proto = Object.getPrototypeOf(this) return proto && proto[fn.name] === fn } }