Javascript ES6检测函数是否在类实例的原型链上
给定ES6等级:Javascript ES6检测函数是否在类实例的原型链上,javascript,function,ecmascript-6,prototype,es6-class,Javascript,Function,Ecmascript 6,Prototype,Es6 Class,给定ES6等级: class C { x () { } fnIsMethodOfC (fn) { return /* ? */ } } 以及多种功能,如 function y () {} z = () => {} 有没有一种有效的方法来确定一个函数是否是C.e c = new C() c.fnIsMethodOfC(c.x) === true c.fnIsMethodOfC(C.prototype.x) === true c.fnIsMethodOfC(y) === false
class C {
x () { }
fnIsMethodOfC (fn) { return /* ? */ }
}
以及多种功能,如
function y () {}
z = () => {}
有没有一种有效的方法来确定一个函数是否是C.e
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
}
}
如果实际函数不同,这还将添加附加检查。您只想检查类自身实现的函数还是原型链中的所有函数?如果名称匹配足够,则可以执行
Object.getOwnPropertyNames(C.Prototype).includes(fn.name)
@LucaKiebel理想的答案是检查链,但是一个合适的开始应该是类实现的。如果你不知道方法名称,那么你就不必搜索它。“可以递归地循环原型链,但这将是一个昂贵的操作。”-你为什么这么认为呢?fn.name
可能适用于类中声明的方法,但并非所有方法都适用。@Bergi是的,更好的答案应该是全面的。修复了它。。应该是fn.name
class C {
fnIsMethodOfC (fn) {
if(!fn || !fn.name) return false;
return !!this[fn.name] && fn === this[fn.name];
}
}