代码之家  ›  专栏  ›  技术社区  ›  bigless

类公共实例字段

  •  0
  • bigless  · 技术社区  · 4 年前

    有人能解释一下,为什么子类公共实例字段不能在父构造函数之前在父props上设置(在实例化过程中都是已知的)?Ofc,你可以通过父构造函数覆盖公共字段,但对我来说,这比在构造函数之前设置一次,然后在super()之后为子字段设置一次更清楚。是否存在语言障碍?

    当这个提议出现时,我以为这就是整个事情的目的(只是在构造函数之前声明)。

    假设,我得到了一个带有构造函数的基类,它对所有子类都是一样的。因为构造函数可以接受参数,在某些情况下,我想尽可能简单地初始化类,比如 new MyClass(args)

    class Person {
      // public fields initialized before constructor
      age
      gender
      etc
         
      constructor(input) {
        setProps() // empty
        parse(input)
      }
      
      setProps() {}
    
      parse() {
        // get age, gender, etc
      }
    }
    
    new Person(input) // works
    

    对于子类,老派的js方法要么用super()重写构造函数,后跟子类part,要么调用类似 setProps() (在我看来,两者都像是编码开销)

    class Student extends Person {
      setProps() {
        this.lessons = []
      }
    
      parse(input) {
        super.parse.call(this, input);
        input.forEach(row => this.lessons.append(row.something))
      }
    }
    
    new Student(input) // works
    

    对于子类公共实例字段,我得到以下结果 doc 说)

    class Student extends Person {
      // public fields initialize after super()
      lessons = []
    
      parse(input) {
        super.parse.call(this, input);
        input.forEach(row => this.lessons.append(row.something))
      }
    }
    
    new Student(input) // throws error because this.lessons is undefined
    

    我是否错过了上面没有提到的方法?

    0 回复  |  直到 4 年前