es6 class是原型继承的语法糖,本质仍基于函数、prototype和[[prototype]]链;class声明生成构造函数及prototype对象,方法挂载于prototype,静态方法挂载于构造函数自身,extends通过原型链与构造函数委托实现继承,super()等价于parent.call(this),实例属性在构造时赋值,私有成员用weakmap模拟隔离。

ES6 的 class 语法不是新继承机制,而是对原型继承的语法封装。它背后完全基于函数、prototype 和 [[Prototype]] 链运作。理解其与原型的映射关系,能避免“类是面向对象”的误解,写出更可控的代码。
class 声明 → 构造函数 + prototype 对象
class Foo {} 等价于:
– 创建一个不可枚举、不可重写、具有 constructor 属性的函数(即 Foo);
– 自动在 Foo.prototype 上挂载所有方法(包括 constructor 方法本身);
– Foo.prototype.constructor === Foo 始终成立。
- 类体中写的普通方法(如
bar() {})→ 添加到Foo.prototype.bar - 类体中写的
static method() {}→ 添加到Foo.method(即构造函数自身属性) - 类体中写的
get prop() {}或set prop(v) {}→ 通过Object.defineProperty(Foo.prototype, 'prop', {...})定义
extends 继承 → 原型链 + 构造函数委托
class Child extends Parent {} 实际执行两件事:
– 设置 Child.prototype.[[Prototype]] = Parent.prototype(即子类实例可访问父类原型方法);
– 设置 Child.[[Prototype]] = Parent(即子类构造函数继承父类静态方法)。
-
super()在子类constructor中调用 → 本质是Parent.call(this, ...args) -
super.method()在实例方法中调用 → 本质是Parent.prototype.method.call(this, ...args) - 若未显式写
constructor,class 会自动补上constructor(...args) { super(...args); }
实例属性(public field)→ 构造函数内赋值
class Foo { x = 1; y = this.x + 1; } 不是定义在 prototype 上,而是在每次 new Foo() 时,等效于在构造函数开头执行:
x = 1;<br>y = this.x + 1;
- 这些属性属于实例自身(
hasOwnProperty返回true),不共享 - 不参与原型查找,比
prototype上的同名属性优先级更高 - 暂无原生方式将其定义在
prototype上(需手动Foo.prototype.z = ...)
私有成员(#field / #method)→ WeakMap 模拟隔离
私有字段和方法并非语言底层支持的“真正私有”,而是编译器/运行时借助 WeakMap 实现作用域隔离:
- 每个私有名称(如
#x)被转为唯一 Symbol 或内部键 - 类内部方法通过该键从
WeakMap获取/设置实例专属值 - 外部无法访问或枚举,也无法绕过(语法层面禁止),但不改变原型链结构
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











