子类构造函数中属性初始化的核心是父类负责自身属性、子类只初始化新增属性,且必须先调用super()再操作this;引用类型需在constructor中用this独立创建,方法应定义在原型上而非constructor内。

子类构造函数中初始化属性,核心是明确“谁来初始化”和“什么时候初始化”。父类负责自身专属属性,子类只管自己新增的;所有实例属性必须在构造函数内用 this 显式赋值,且顺序固定、类型一致。
必须第一行调用 super(),再操作 this
ES6 class 语法下,子类 constructor 中 super() 必须是第一句。不调用会报错;提前访问 this 也会报错。super() 的作用是触发父类构造函数执行,并让 this 指向即将完成初始化的新实例。
- 父类有参数(如
constructor(id, name)),子类 super() 就得传对应值:super(id, name) - 父类没写 constructor,super() 仍会调用默认空构造函数,安全无副作用
- super() 执行完,父类的实例属性(如
this.id、this.colors = [])才真正挂载到 this 上
父类属性由父类构造函数初始化,子类不重复定义
子类不该在自己的 constructor 里重新初始化父类已声明的属性(比如再写 this.name = name),除非是覆盖逻辑。正确做法是:让父类构造函数完成它该做的事,子类只专注新增字段。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确:父类处理
this.name和this.tags = [];子类只加this.breed或this.grade - ❌ 错误:子类 constructor 里又给
this.name赋值,既冗余,又可能破坏父类初始化意图 - 引用类型(数组、对象)尤其不能放在 prototype 上共享,必须在构造函数中用
this.xxx = []独立创建
子类自有属性在 super() 后立即初始化
子类自己的实例字段,应在 super() 调用之后、constructor 主体其他逻辑之前统一赋值。这样既保证顺序可控,也利于 V8 引擎生成稳定隐藏类,提升后续属性访问性能。
立即学习“Java免费学习笔记(深入)”;
- 推荐风格:
super(); this.breed = breed; this.level = level || 1; this.skills = []; - 避免条件分支中动态添加属性,例如不要写
if (opts) { this.config = opts; },否则导致隐藏类分裂 - 字段初始化器(如
breed = 'dog';)虽自动执行,但时机在 super() 返回后、constructor 前,适合简单默认值;复杂逻辑仍建议写进 constructor 开头
别在构造函数里重复定义方法
方法属于行为复用,不是每个实例都需要一份副本。把方法写在 constructor 内(如 this.say = function() {})会浪费内存,也违背面向对象设计原则。
- ✅ 正确:方法写在 class 体中(非 constructor 内),自动挂载到原型上,所有实例共享
- ✅ 正确:使用原型链方式时,统一挂到
Child.prototype.sayName = function() {} - ❌ 错误:在 constructor 里反复声明函数,造成每个实例都多占一份内存

















