ES6 class 是函数和原型链的语法糖,本质仍是构造函数;它不提升、默认严格模式、方法不可枚举,继承中 super() 必须在子类 constructor 中 this 前调用,静态方法 this 指向类本身。

ES6 的 class 不是新对象模型,只是函数和原型链的语法糖;直接用它写类没问题,但若想真正理解行为(比如继承、this 绑定、静态方法调用),必须清楚底层仍是 function 和 prototype。
class 声明本质就是构造函数
你写的 class Person { constructor(name) { this.name = name; } },等价于:
function Person(name) {
this.name = name;
}
Person.prototype.constructor = Person;
区别在于:class 声明不会被提升(hoist),且严格模式下自动启用;而函数声明会提升。常见错误是:在 class 定义前就引用它,会报 ReferenceError。
-
class内部所有方法默认不可枚举(Object.keys()看不到) - 类体中只能写方法定义、
get/set、static成员,不能写普通变量或表达式 - 省略
constructor时,JS 自动插入空构造函数,但若父类有带参构造器,子类又没显式写super(),就会报ReferenceError: Must call super constructor
extends 和 super 的调用顺序很关键
子类构造函数中,必须在访问 this 前调用 super() —— 否则直接报错。这不是风格建议,是强制规则。
立即学习“Java免费学习笔记(深入)”;
例如:
class Animal { constructor(name) { this.name = name; } }
class Dog extends Animal {
constructor(name, breed) {
console.log(this); // ❌ 报错:Cannot access 'this' before initialization
super(name);
}
}
-
super()必须在子类constructor第一行之后、任何this访问之前调用 -
super.xxx可用于调用父类方法,但仅限非构造器上下文(如实例方法里) - 静态方法中不能用
super(),要用super.staticMethod()
static 方法和实例方法的 this 指向完全不同
static 方法里的 this 指向类本身(即构造函数),而实例方法里的 this 指向实例。这点极易混淆,尤其在回调或事件绑定中。
例如:
class Logger {
static log(msg) { console.log('STATIC:', msg); }
instanceLog(msg) { console.log('INSTANCE:', msg); }
}
Logger.log('hello'); // ✅ 输出 STATIC: hello
Logger.instanceLog('hi'); // ❌ TypeError: Logger.instanceLog is not a function
- 静态方法不能访问
this.name(因为没实例),也不能调用实例方法 - 实例方法可以调用
super.xxx(),但静态方法调用父类静态方法需写成super.constructor.staticMethod()或更稳妥地用类名 - 箭头函数在 class 中不改变
this绑定逻辑,但它本身没有this,所以写instanceMethod = () => { ... }是为避免手动bind,不是为了“修复” class 的 this
真正容易被忽略的是:class 无法像函数那样被当作值自由传递并动态修改 prototype —— 一旦用 class 定义,它的 prototype 是不可写(writable: false)的,直接赋值 MyClass.prototype.foo = ... 不会报错但无效;必须用 Object.defineProperty 或在 class 内部定义。











