ES6 class 是语法糖,本质仍基于原型继承;constructor 必须显式调用 super()(子类中),static 成员属类本身而非实例,类字段需注意兼容性。
class 不是新对象模型,只是语法糖JavaScript 的 class 关键字没有引入新的面向对象机制,它背后仍是基于原型的继承。写 class 本质上是在操作 prototype,只是把原来分散的 function 声明、MyClass.prototype.xxx = function() {...} 等写法收束成更清晰的结构。如果你试图用它模拟 Java/C# 的类加载或静态类型行为,会很快遇到困惑。
常见错误现象:class Person {} 定义后直接 Person.name 拿到的是字符串 "Person",不是实例名;new Person().constructor === Person 为 true,说明它仍指向构造函数本身。
constructor,且不能省略ES6 类中,constructor 是唯一能初始化实例属性和调用 super() 的地方。没有显式写 constructor,引擎会自动补一个空的;但一旦写了子类的 constructor,就必须手动调用 super(),否则报错 "Must call super constructor in derived class before accessing 'this' or returning from derived constructor"。
constructor:等价于 constructor() {}
constructor 却没调用 super() → 直接抛 ReferenceError
super() 必须在访问 this 之前调用,哪怕只写 console.log(this) 都会失败示例:
立即学习“Java免费学习笔记(深入)”;
class Animal {
constructor(name) {
this.name = name;
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // 必须第一行
this.breed = breed;
}
}static 方法和属性不挂载到实例上static 关键字声明的成员属于类本身,不是原型链的一部分,因此不能通过 new Xxx() 创建的实例访问。它常用于工具方法(如 fromJSON)、常量或工厂函数。
容易踩的坑:
dogInstance.staticMethod() → undefined 或 TypeError
Dog.staticMethod() 才是正确调用方式static 属性在类定义时即求值,不支持私有字段语法(#field)与 static 组合(目前仅 Stage 4 提案,主流环境不支持)static 方法会被子类继承,可通过 Child.staticMethod() 调用像

name = "default" 这种公有字段语法(非函数)属于 ES2025 正式特性,但早期版本(如 Chrome 72–78、Safari 14.1 之前)不支持,若需兼容旧环境,得用 constructor 初始化或借助 Babel。
使用场景:
constructor 中重复写 this.xxx = xxx
#privateField 实现真正私有状态(仅限最新引擎)count = Math.random() 每次都不同示例(需确认目标环境支持):
class Counter {
#value = 0; // 私有字段
step = 1; // 公有字段
get current() { return this.#value; }
inc() { this.#value += this.step; }
}类字段和私有方法在生产环境启用前,务必查 caniuse 或用构建工具兜底。真正在意运行时行为的,别只看语法是否“看起来像类”。
来电咨询