将ES5构造函数+原型写法重构为class语法需理清结构与逻辑:统一初始化进constructor、方法写入class主体、静态成员标static、继承用extends+super、注意不可枚举性及new约束。

直接把旧的构造函数+原型写法,换成 class 语法,不是简单改个关键字,而是要理清结构、意图和执行逻辑。重构后代码更紧凑、可读性更高,也更容易配合现代工具链做类型检查或自动补全。
识别并合并构造逻辑与原型方法
ES5 中构造函数和原型方法是分离定义的,容易遗漏或错位。重构时要把所有实例属性初始化收进 constructor,把所有实例方法统一写在 class 主体里。
- 原来写在
Person.prototype.greet = function() {...}的方法,现在直接写成greet() { ... } - 原来在构造函数里手动挂到
this上的属性(如this.name = name),继续保留在constructor中 - 避免在 class 内部再用
prototype手动扩展,那会破坏 class 的封装性和一致性
正确处理静态成员与私有语义
ES5 里常把工具方法或配置数据挂在构造函数本身上(如 Person.species = 'Homo' 或 Person.createDefault())。这类内容在 class 中应明确标为 static。
- 静态方法直接加
static前缀,调用方式不变(Person.species()) - 静态属性需配合类字段提案(
static species = 'Homo'),注意兼容性;若目标环境不支持,可用 static getter 替代 - 没有真正私有字段时,用下划线前缀(如
_internalId)表达约定,不建议强行模拟私有——class 本身不提供运行时私有保护
继承关系要显式调用 super 并对齐参数
ES5 继承靠 Object.create(Person.prototype) 和手动 Person.call(this, ...),易出错。class 继承必须用 extends + super(),且顺序不能颠倒。
- 子类
constructor中,super(...)必须出现在任何使用this之前 - 父类构造函数参数要完整传入
super(),子类新增字段再单独赋值 - 重写方法时,用
super.methodName()显式调用父实现,比 ES5 的Person.prototype.methodName.call(this)更清晰
注意 class 的不可枚举性与 new 调用约束
class 定义的方法默认不可枚举,而 ES5 原型方法是可枚举的——这会影响 for...in 或 Object.keys() 的行为。另外,class 必须用 new 实例化,否则报错。
- 如果旧代码依赖遍历实例方法(比如插件系统),需评估是否要改用
Object.getOwnPropertyNames()或显式暴露接口 - 不要试图把 class 当普通函数调用,也不要在 class 内部尝试绕过
new检查——这是设计约束,不是 bug - constructor 默认返回
this,但可以显式返回其他对象(较少用,慎用)


















