Функции не «знают» это о себе. Когда вы передаете ссылку на функцию, это просто ссылка на функцию - она не отслеживает, кто содержит ссылку на нее. В самой функции нет ничего особенного, что делает ее статической.
Это, вероятно, хрупкий случай, и, вероятно, существуют крайние случаи, особенно когда вы хотите расширить класс. С учетом вышесказанного вы можете выполнить поиск по прототипу класса и посмотреть, содержит ли одно из его свойств ссылку на рассматриваемую функцию:
class MyClass {
static myStaticMethod() {
return 'hi'
}
myMethod() {
return 'hi'
}
isStatic(func) {
// return a boolean here which shows whether func is static or not
for (let name of Object.getOwnPropertyNames(MyClass)) {
if (func === MyClass[name])
return true
}
return false
}
test1() {
return this.isStatic(MyClass.myStaticMethod)
}
test2() {
return this.isStatic(this.myMethod)
}
}
const obj = new MyClass()
console.log(obj.test1()) // should return true - currently returns undefined
console.log(obj.test2()) // should return false - currently returns undefined
Возможно, имеет смысл isStatic
быть статической функцией. Тогда вы могли бы избежать жесткого кодирования имени класса в методе:
class MyClass {
static myStaticMethod() {
return 'hi'
}
myMethod() {
return 'hi'
}
static isStatic(func) {
// return a boolean here which shows whether func is static or not
for (let name of Object.getOwnPropertyNames(this)){
if (func === this[name])
return true
}
return false
}
test1() {
return Object.getPrototypeOf(this).constructor.isStatic(MyClass.myStaticMethod)
}
test2() {
return Object.getPrototypeOf(this).constructor.isStatic(this.myMethod)
}
}
const obj = new MyClass()
console.log(obj.test1()) // should return true - currently returns undefined
console.log(obj.test2()) // should return false - currently returns undefined