Свойства класса: доступ к свойствам дочернего класса в родительском конструкторе - PullRequest
0 голосов
/ 21 декабря 2018

Я хотел бы создать класс ES6, который может читать его дочерние свойства уже на уровне конструктора.Другими словами, я хотел бы передать эти спецификации:

class Collection {
  model = 'model';

  constructor() {
    // I JUST DO A SIMPLE ASSIGNMENT HERE
    // BUT IN THE FINAL VERSION I WOULD
    // LIKE TO DO SOME MORE ADVANCED
    // CALCULATIONS HERE
    this.modelCopy = this.model;
  }

  getModel() {
    return this.model;
  }
}

class MyCollection extends Collection {
  model = 'myModel';
}

it('this is passing', () => {
  expect(new Collection().getModel()).toBe('model');
  expect(new MyCollection().getModel()).toBe('myModel');
});

it('this is NOT passing', () => {
  expect(new Collection().modelCopy).toBe('model');
  // this fails because new MyCollection().modelCopy === 'model'
  expect(new MyCollection().modelCopy).toBe('myModel');
});

1 Ответ

0 голосов
/ 21 декабря 2018

свойства класса не обрабатываются изначально.До сих пор они преобразуются в plugin-proposal-class-properties.

babel. И если этот плагин транслирует свойства класса в значения, которые инициализируются после вызова constructor(), то ничего вамс этим можно справиться.

Я обнаружил проблему в их github, которая очищает состояния для этого подхода:

Да.Это нельзя сделать до вызова super(), потому что это возвращаемое значение super.Раньше этого не было, поэтому поля классов не могут быть определены.

Спецификация [UPD] здесь: tc39proposal-class-fields , но мне не удалось найтиинформацию, если такой подход предлагается использовать в собственной реализации или нет.

...