ES6 的 class 是原型机制的语法糖,集中定义构造逻辑与方法、自动处理原型链和 this 绑定、简化继承(extends + super)、明确区分静态与实例成员,并通过严格约束避免 ES5 常见错误。

ES6 的 class 关键字不是新模型,而是把原本分散、易错的原型操作打包成更直观的写法——它不改变底层逻辑(仍是基于 prototype 和 this),但大幅降低理解与维护成本。
让类定义一目了然
传统 ES5 中,构造函数和原型方法是割裂的:一个在函数体里赋值属性,另一个要跳到 Constructor.prototype.xxx = function(){} 去加方法。稍不注意就漏写 prototype,或误把方法写成实例属性。
- ES5 写法需两处定位:
function Person() {...}+Person.prototype.sayHi = ... - class 写法全部收拢在同一个代码块内,constructor 定义初始化逻辑,其余方法直接写在花括号里,语义清晰,位置集中
- 无需手动绑定
this或处理prototype链路,编译后自动挂载到原型上
继承不再手动修原型链
ES5 实现继承要四步:调用父构造函数(Parent.call(this))、重设子类原型(Object.create(Parent.prototype))、修正 constructor 指向、再往新原型上添加子类方法——任意一步出错都会导致 instanceof 失效或方法丢失。
- ES6 用
class Child extends Parent一行声明继承关系 -
super()自动完成父构造调用和 this 初始化,不调用会报错,强制规范流程 - 子类方法自动添加到子类原型,父类方法通过原型链自然可访问,无需干预原型指向
静态方法和实例方法天然区隔
ES5 中静态方法靠直接挂在函数对象上(MyClass.staticMethod = ...),实例方法挂原型上,两者混在一起容易混淆;而 class 明确用 static 关键字标记静态成员,视觉和语义都分离。
- 静态方法属于类本身,如
Math.max()风格,适合工具型逻辑 - 实例方法默认写在 class 内部,不加 static,自动归入原型,供所有实例共享
- 避免手写时把该静态的方法错挂到 prototype,或反之
约束更严格,减少低级错误
class 不是自由语法:它禁止重复声明、不支持变量提升(存在暂时性死区)、方法定义不加 function 关键字、必须用 new 调用——这些限制看似“不灵活”,实则堵住了 ES5 中常见陷阱。
- 没写
new直接调用 class?立即 TypeError,而不是静默返回 undefined 或污染全局 - 类名提前使用?抛出 ReferenceError,不像函数声明可被提升,强制代码顺序合理
- 方法间不能加分号、constructor 必须唯一——减少格式争议和意外覆盖


















