JavaScript的class本质是ES5构造函数+原型链的语法糖,需手动还原构造逻辑、原型方法、继承关系(Object.create实现寄生组合继承)和静态成员(挂载到函数对象),并配合es5-shim/sham垫片兼容老旧浏览器。

JavaScript 的 class 语法本质是 ES5 构造函数 + 原型链的语法糖,转成 ES5 并不难,关键是还原出构造逻辑、原型方法、继承关系和静态成员。
手动转换 class 基本结构
ES6 的 class 定义会被等价替换为一个带 prototype 方法的函数:
-
constructor → 普通函数体,用
this初始化实例属性 -
实例方法 → 挂在函数的
prototype上,不能写成箭头函数(否则丢失this) - 类名本身 → 就是那个函数名,可直接调用或作为构造器使用
例如:class Person { constructor(name) { this.name = name; } sayHi() { return `Hi, ${this.name}`; } }
等价于:
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function() {
return 'Hi, ' + this.name;
};
处理 extends 继承关系
ES6 的 extends 需拆解为两步:构造函数继承 + 原型链继承。推荐使用 Object.create 实现寄生组合继承(避免父类构造函数被重复调用):
立即学习“Java免费学习笔记(深入)”;
- 子类构造函数中用
Parent.call(this, ...)继承实例属性 - 子类
prototype设为Object.create(Parent.prototype) - 补回子类
constructor指向自身,防止原型链断裂
示例:class Student extends Person { constructor(name, grade) { super(name); this.grade = grade; } study() { return `${this.name} is in grade ${this.grade}`; } }
对应 ES5:
function Student(name, grade) {
Person.call(this, name);
this.grade = grade;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.study = function() {
return this.name + ' is in grade ' + this.grade;
};
处理 static 静态方法和属性
静态成员不属于实例,而是直接挂在类(即函数)本身上:
-
static 方法 → 直接赋值给函数对象,如
Person.compare = function() {...} -
static 属性 → 同样挂到函数上,如
Person.species = 'Homo sapiens' - 注意:ES5 不支持类字段语法(
static x = 1),必须显式赋值
兼容老旧浏览器的补充措施
即使手写了 ES5 形式,若代码中还用了 Array.prototype.map、Object.keys、Function.prototype.bind 等,仍需垫片支持:
- 引入
es5-shim.js(必须优先加载) - 再引入
es5-sham.js(补充非标准但实用的实现) - 确保它们在你自己的脚本之前执行
HTML 中顺序示例:
<script src="es5-shim.js"></script> <script src="es5-sham.js"></script> <script src="your-es5-code.js"></script>


















