ES6 определяет, находится ли функция в цепочке прототипов экземпляра класса - PullRequest
0 голосов
/ 02 сентября 2018

Учитывая класс 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 голосов
/ 05 февраля 2019
class C {
  fnIsMethodOfC (fn) {
    if(!fn || !fn.name) return false;
    return !!this[fn.name] && fn === this[fn.name];
  }
}

Это также добавит дополнительную проверку, если фактическая функция отличается.

0 голосов
/ 02 сентября 2018

Один из вариантов может быть:

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