JavaScript中“从原型到类”的演进本质是语法糖升级,class仍完全依赖原型链:声明类即创建函数,方法挂载于prototype,继承通过__proto__链接实现,运行时行为与function构造器一致。

JavaScript 中“从原型到类”的演进,本质是语法糖的升级,不是底层机制的替换。class 关键字看起来像传统面向对象语言(如 Java),但背后依然完全依赖原型链(prototype chain)工作。
class 只是 prototype 的语法包装
用 class 声明一个类,实际仍是创建函数,并把方法挂载在原型上:
- class Person {} 等价于 function Person() {}
- class 中定义的实例方法(如 sayHello())自动添加到 Person.prototype 上
- 通过 new Person() 创建的实例,其 __proto__ 仍指向 Person.prototype
继承也靠原型链实现
extends 并没有引入新机制,只是自动设置原型关系:
- class Student extends Person 会把 Student.prototype.__proto__ 指向 Person.prototype
- super() 在构造器中实际调用的是父类构造函数,而非某种“类系统”专属能力
- 静态方法(static)则挂载在构造函数本身上,即 Student.__proto__ === Person,这也是原型链的一部分
可观察的证据:运行时行为没变
无论用 function 还是 class 定义,以下行为完全一致:
- 所有实例共享原型上的方法(修改 Person.prototype.sayHello,所有实例立即受影响)
- obj instanceof Person 判断依据仍是原型链查找
- Object.getPrototypeOf(obj) === Person.prototype 对 class 实例同样成立
理解这个演进的关键价值
看清语法和机制的分离,能帮你:
- 不被 class 表象误导,避免写出“假面向对象”代码(比如误以为有真正的私有字段或块级作用域继承)
- 调试时直奔原型链,快速定位方法来源或属性缺失原因
- 兼容老代码时自然过渡——class 可以和 function 构造器、Object.create() 混用,因为它们操作的是同一套原型体系










