JavaScript это функция статическая - PullRequest
1 голос
/ 14 мая 2019

Можно ли определить, является ли функция JavaScript статической? Я написал класс для проверки этого, но мне нужно кодировать метод isStatic, который должен возвращать логическое значение, показывающее, является ли переданный func статическим (возвращает true) или нет (возвращает false). Кто-нибудь получил код для этого? ТНХ

class MyClass {
  static myStaticMethod() {
    return 'hi'
  }
  myMethod() {
    return 'hi'
  }
  isStatic(func) {
    // return a boolean here which shows whether func is static or not
  }
  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

1 Ответ

1 голос
/ 14 мая 2019

Функции не «знают» это о себе. Когда вы передаете ссылку на функцию, это просто ссылка на функцию - она ​​не отслеживает, кто содержит ссылку на нее. В самой функции нет ничего особенного, что делает ее статической.

Это, вероятно, хрупкий случай, и, вероятно, существуют крайние случаи, особенно когда вы хотите расширить класс. С учетом вышесказанного вы можете выполнить поиск по прототипу класса и посмотреть, содержит ли одно из его свойств ссылку на рассматриваемую функцию:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...