检查函数是否是类的方法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查函数是否是类的方法?相关的知识,希望对你有一定的参考价值。
有没有办法确定函数是否是某个类的方法?
我有一个class A
与方法doesMethodBelongHere
,它采取函数作为参数method
。我想确定method
是A
的实际方法。
class A {
methodA() {
console.log('method of A');
}
doesMethodBelongHere(method) {
// it should return true if `method` argument is a method of A
return Object.values(this).includes(method);
}
}
const a = new A();
console.log(a.doesMethodBelongHere(a.methodA)); // should return true
答案
您可以使用Object.getPrototypeOf()
来获取原型。然后使用for...of
和Object.getOwnPropertyNames()
迭代原型属性。如果该方法等于原型上的一个方法返回true
:
class A {
methodA() {
console.log('method of A');
}
doesMethodBelongHere(method) {
// get the prototype
const proto = Object.getPrototypeOf(this);
// iterate the prototype properties, and if one them is equal to the method's reference, return true
for(const m of Object.getOwnPropertyNames(proto)) {
const prop = proto[m];
if(typeof(prop) === 'function' && prop === method) return true;
}
return false;
}
}
const a = new A();
Object.assign(a, { anotherMethod() {} });
a.anotherMethod2 = () => {};
console.log(a.doesMethodBelongHere(a.methodA)); // should return true
console.log(a.doesMethodBelongHere(a.anotherMethod)); // should return false
console.log(a.doesMethodBelongHere(a.anotherMethod2)); // should return false
另一答案
您可以使用typeof
运算符
let isfn = "function" === typeof ( a.methodA );//isfn should be true
isfn = "function" === typeof ( a["methodA"] );//isfn should be true
isfn = "function" === typeof ( a["methodAX"] );//isfn should be false
Edit
doesMethodBelongHere( method ) {
return "function" === typeof ( this[method.name] )
}
另一答案
class A {
constructor() {
this.methodA = this.methodA.bind(this);
this.doesMethodBelongHere = this.doesMethodBelongHere.bind(this);
}
methodA() {
console.log('method of A');
}
doesMethodBelongHere(method) {
// it should return true if `method` argument is a method of A
return Object.values(this).includes(method);
}
}
const a = new A();
console.log(a.doesMethodBelongHere(a.methodA)); // should return true
另一答案
我建议使用以下实现:
- 在构造函数原型上使用Object.getOwnPropertyNames(同样访问
A.prototype
,但是采用更通用的方法)以迭代类方法。 - 使用method.name获取方法名称
- 使用Array.some,查找(1)是否包含给定方法的名称。
class A { constructor() { this.a = 2; this.bb = 3; } methodA() { console.log('method of A'); } doesMethodBelongHere(method) { // it should return true if `method` argument is a method of A return this.constructor.prototype[method.name] === method; } }
以上是关于检查函数是否是类的方法?的主要内容,如果未能解决你的问题,请参考以下文章