должен вызываться из конструктора или нет.

орошая / плохая практика вызывать дочерний метод из родительского класса?

class Parent {
    constructor() {
        // if 'autoPlay' exists (was implemented) in chain
        if (this.autoPlay) {
            this.autoPlay(); // execute from parent
        }
    }
}

class ChildA extends Parent {
    autoPlay() {
        console.log('Child');
    }
}

class ChildB extends Parent {
    // 'autoPlay' wasn't implemented
}

const childA = new ChildA();
const childB = new ChildB();
 Ali Mamedov14 дек. 2017 г., 19:41
@LucasSteffen, каждый класс, который расширяет 'Parent', имеет свою собственную реализацию 'autoPlay'. Так что невозможно переместить этот метод в родительский класс
 estus14 дек. 2017 г., 19:49
Детский класс должен иметь свойconstructor, Нет, это не очень хорошая практика, если классы не следуют какому-либо интерфейсу, напримерinit метод.
 Bergi14 дек. 2017 г., 19:42
В общем случае не рекомендуется вызывать переопределенные методы.от конструктора, как вы попали в кучу проблем порядка инициализации. Рекомендуется не вызывать какие-либо методы из конструктора, а только выполнять инициализацию экземпляра. Любые побочные эффекты, такие какautoplay должен быть вызван вызывающим абонентом, который создал экземпляр. (В противном случае, да, вполне нормально вызывать переопределенные методы, подобные этим, хотя обычно вам даже не нужна эта проверка «если определено»)
 Paulpro14 дек. 2017 г., 19:42
@AliMamedov Должен ли он быть определен каждым ребенком? В этом случае вы должны реализовать это в родительском, но выбросить ошибку. Что-то вродеautoPlay ( ) { throw new Error( 'autoPlay must be implemented' ); }.
 Lucas Steffen14 дек. 2017 г., 19:38
Да, родительский класс не имеет договора с дочерним классом, наоборот. Кроме того, это не имеет смысла, просто переместите метод в родительский класс.

Ответы на вопрос(2)

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

class Parent {
  constructor() {
    this.autoPlay();
  }

  autoPlay() {

  }
}

class Child extends Parent {
  autoPlay() {
    console.log('Child');
  }
}

const child = new Child();
 scipper14 дек. 2017 г., 19:46
Или это шляпа¯\_(ツ)_/¯
 jfriend0014 дек. 2017 г., 23:15
В этом случае,Parent упоминается как абстрактное определение класса (абстрактное, потому что оно может быть бесполезным, просто создав его экземпляр). Он предоставляет общее определение / интерфейс методов, но не реализацию всех из них, и ожидает, что производный класс завершит реализацию. Это обычная методика объектно-ориентированного проектирования, которая позволяет нескольким производным классам совместно использовать связку реализации в родительском объекте, а в некоторых случаях сам родительский объект никогда не используется сам по себе. Это отдельный вопрос, является лиautoPlay() должен вызываться из конструктора или нет.
 Paulpro14 дек. 2017 г., 19:44
Не уверен, почему это было понижено.
 Bergi14 дек. 2017 г., 19:43
Не уверен, почему это было понижено.
 scipper14 дек. 2017 г., 19:44
Ну, это все еще плохая практика .. может быть, поэтому.
Решение Вопроса

класса?

Да, это абсолютно нормальная практика. Родительский класс просто вызывает некоторый метод экземпляра, и если дочерний класс переопределил метод, то вызывается дочерний метод. Однако вы обычно не выполняете такой тест «мой экземпляр определил этот метод», вы просто вызываете его. Если вы не хотите ничего делать по умолчанию, просто определите пустой метод (как в ответе @ scipper). Если вы хотите сделать метод абстрактным (заставить дочерние классы переопределять его), вы можете либо оставить его неопределенным, либо определить метод, который выдает соответствующее исключение.

Это плохая практика для вызова дочернего метода от родителяконструктор?

Да. Не делай этого. (Это проблема ввсе языки).

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

Придуманный пример:

class Parent {
    autoPlay() {
        this.play("automatically "); // call child method
    }
    play(x) {
        console.log(x+"playing default from "+this.constructor.name);
    }
}

class ChildA extends Parent {
    // does not override play
}
class ChildB extends Parent {
    constructor(song) {
        super();
        this.song = this;
    }
    play(x) {
        console.log(x+"playing "+this.song+" from ChildB");
    }
}

const child1 = new ChildA();
child1.autoPlay();
const child2 = new ChildB("'Yeah'");
child2.autoPlay();

Обратите внимание, как это не будет работать, еслиParent конструктор позвонилautoplay, Если вам не нравится всякий раз после создания экземпляра вызывать дополнительный вызов метода, используйте вспомогательную функцию. Это может быть даже статический метод:

class Parent {
    autoPlay() { … }
    play { … }
    static createAndAutoPlay(...args) {
        const instance = new this(...args);
        instance.autoPlay();
        return instance;
    }
}
…
const child1 = ChildA.createAndAutoPlay();
const child2 = ChildB.createAndAutoPlay("'Yeah'");

Ваш ответ на вопрос