【问题标题】:Class properties: Access child class properties in parent constructor类属性:在父构造函数中访问子类属性
【发布时间】:2019-05-21 17:50:32
【问题描述】:

我想构建一个 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');
});

【问题讨论】:

  • 您能澄清一下当前的行为和预期的行为吗?断言是前者吗?那么后者是什么。
  • 另外model = 'myModel'; 不是有效的JS
  • @NurbolAlpysbayev 当前行为是new MyCollection().modelCopy 返回'model'。虽然我想得到myModel。 @skyboyer 的回答似乎清楚地解释了这个问题。我无法通过类属性实现我想要的。我需要考虑不同的结构。
  • 如果你使用的是类属性,那么你没有使用 ES6。

标签: javascript ecmascript-next


【解决方案1】:

类属性不是原生处理的。到目前为止,它们被 babel 的plugin-proposal-class-properties 改造。

如果这个插件将类属性转换成值被初始化之后 constructor() 被调用,你就无能为力了。

我在他们的 github 中有 found an issue 明确说明了这种方法:

是的。在调用super()之前不能这样做,因为这是super的返回值。以前,这不存在,因此无法定义类字段。

[UPD] 规范在这里:tc39proposal-class-fields 但我未能找到信息是否建议在本机实现中遵循这种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多