ES6继承中属性不支持覆盖,仅能通过super()初始化父类属性(如this.name)并随后重新赋值或新增自有属性;super()必须首行调用,否则报ReferenceError,且引用类型属性各实例独立。

ES6继承中,属性本身不支持“覆盖”概念,只有“初始化”和“重新赋值”两种行为。子类无法像方法那样通过同名定义来覆盖父类属性,但可以通过构造函数中的赋值顺序和时机,实现对父类属性的重设或补充。
父类属性靠 super() 初始化
父类的实例属性(如 this.name、this.age)必须在子类 constructor 中第一行调用 super() 才能正确挂载。这一步不是“继承”,而是执行父类构造函数,完成父类属性的初始化。
- 漏掉 super() → this 不可用,报 ReferenceError
- super() 位置不对(不在首行)→ 同样报错
- 传参错误(如少传 name)→ 对应属性为 undefined,但不会报错
子类可重新赋值同名属性
super() 执行后,子类可以对已存在的属性(如 this.name)再次赋值,这会直接覆盖父类构造函数中设置的值。这不是语法层面的“覆盖”,而是运行时的普通变量写入。
- 例如:super('张三'); 设置了 this.name = '张三',之后写 this.name = '李四',最终值就是 '李四'
- 这种操作不改变原型链,也不影响其他实例
- 适用于需要根据子类逻辑动态修正父类初始值的场景
新增自有属性要放在 super() 之后
子类自己的属性(如 this.grade、this.token)必须定义在 super() 调用之后。否则会因 this 未就绪而失败。
- 正确:super(name, age); this.grade = grade;
- 错误:this.grade = grade; super(name, age); → 报错
- 自有属性与父类属性共存于同一实例对象上,互不干扰
注意引用类型属性的独立性
如果父类构造函数中初始化了引用类型属性(如 this.colors = ['red']),每个子类实例都会获得一份独立副本,不会互相影响。这是 ES6 继承相比 ES5 原型链继承的一大改进。
- 修改 child1.colors.push('blue') 不会影响 child2.colors
- 本质是每次 super() 都新建一个对象/数组,而非共享原型上的引用


















