@darknefrit

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

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

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

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

    }

}


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

class MyClass {

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

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

    }

}
  • Вопрос задан
  • 100 просмотров
Решения вопроса 2
Seasle
@Seasle Куратор тега JavaScript
\( ゚ヮ゚)/
- if (this.hasownproperty("secondMethod")) {
+ if (this.hasOwnProperty("secondMethod")) {

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

Вообще не понятно, почему в одном экземпляре класса будет метод, а другом - нет.
Ответ написан
Tim-A-2020
@Tim-A-2020 Куратор тега JavaScript
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, проверяется во всей цепочке прототипов, при длинной цепочке наследования может быть неоправданно затратной операцией
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Artezio Витебск
от 2 800 до 3 300 $
01 мар. 2021, в 22:54
150000 руб./за проект
01 мар. 2021, в 22:20
5000 руб./за проект