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

问题描述 投票:5回答:2

鉴于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

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

链接相关问题:

javascript function ecmascript-6 prototype es6-class
2个回答
0
投票

一种选择可能是:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.