Задать вопрос
@darknefrit

Как проверить наличие метода в классе?

Вероятно я не понимаю как работают классы в JS.
Допустим я делаю класс, создаю в нём методы, и хочу из одного метода вызвать другой метод, это корректный подход ?
class MyClass {

    method (){
        .... какойто код...
        this.secondMethod()
    
    }

    secondMethod(){
        .... какойто код....

    }

}


и ещё вопрос как проверить наличие метода в классе

class MyClass {

    method (){
        .... какойто код...
        if ( this.hasownproperty("secondMethod")) { // не работает
           this["secondMethod"]()
         }
    
    }

    secondMethod(){
        .... какойто код....

    }

}
  • Вопрос задан
  • 1718 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 2
Seasle
@Seasle Куратор тега JavaScript
- if (this.hasownproperty("secondMethod")) {
+ if (this.hasOwnProperty("secondMethod")) {

или
if ('secondMethod' in this) {
    ...
}

Вообще не понятно, почему в одном экземпляре класса будет метод, а другом - нет.
Ответ написан
Комментировать
Tim-A-2020
@Tim-A-2020
class MyClass {

  method() {
    console.clear();
    console.log(Reflect.has(this, 'secondMethod')) // true
    console.log(this.hasOwnProperty('secondMethod')); // false
    console.log('secondMethod' in this) // true
    console.log(this.secondMethod !== undefined) // true
  }

  secondMethod() {

  }

}
let myClass = new MyClass();
myClass.method();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dimoff66
Кратко о себе: Я есть
В этом и смысл названия hasOwnProperty, что проверяется наличие свойства среди собственных свойств объекта, игнорируя объекты, от которых он наследован.

class MyClass {
   method1 () { alert(1) }
   method2 () { alert(2) }
}

const obj = new MyClass
obj.method3 = () => { alert(3) }

console.log(obj.hasOwnProperty('method2')) 
// false, потому что это свойство родителя, не собственное

console.log(obj.hasOwnProperty('method3')) 
// true, потому что это свойство не унаследовано а добавлено непосредственно к объекту

console.log(Boolean(obj.__proto__.method2)) 
// true, проверяется в наследованном от непосредственного родителя прототипе

console.log(Boolean(obj.method2)) 
// true, проверяется во всей цепочке прототипов, при длинной цепочке наследования может быть неоправданно затратной операцией
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы