JS中class本质是原型链的语法糖封装,运行时仍为构造函数,实例__proto__指向prototype,方法挂载于原型;class通过new限制、严格模式、不可枚举方法、TDZ等硬约束提升安全性与可维护性。

JS 原型链和 ES6 class 不是两种并列的机制,class 就是原型链的语法封装——没有脱离原型链的新模型,只有更规范、更安全的写法。
运行时本质完全一致
无论用 function 构造函数还是 class 定义,最终创建的对象都是普通对象,方法都挂在 prototype 上,实例的 __proto__ 都指向对应构造器的 prototype。你可以直接验证:
-
typeof class {}返回 "function",说明 class 声明生成的是函数 -
class Person {}的Person.prototype确实存在,且实例的__proto__指向它 - 手动给
Person.prototype添加方法,class 实例一样能调用
语法层的关键约束差异
class 不是“更高级的类”,而是对构造函数用法做了硬性限制,让原型链行为更可预期:
-
只能通过 new 调用:直接
Person()会报错,避免 this 指向意外丢失 -
内部自动启用严格模式:无需手动写
"use strict" -
方法不可枚举:class 中定义的方法默认不被
for...in遍历,而 function 构造函数手动挂到 prototype 上时需额外用Object.defineProperty控制 - 存在暂时性死区(TDZ):class 声明不会被提升,且在声明前访问会报 ReferenceError
继承写法背后仍是原型链操作
ES5 手动实现继承要三步:调父构造函数 + 设置子 prototype + 修正 constructor;class 的 extends 和 super 把这三步收束成一句语法,但底层没变:
-
extends Parent→ 编译后等效于Child.prototype = Object.create(Parent.prototype) -
super()→ 在 constructor 中实际调用的是Parent.call(this, ...) -
super.method()→ 本质是Parent.prototype.method.call(this)
为什么说 class 是“有糖衣的原型链”
它没引入新机制,但把容易出错、语义模糊的操作(比如乱改 prototype、忘记修 constructor、this 绑定失误)挡在了语法门外。开发者专注“我要建什么结构”,而不是“怎么让 __proto__ 指对地方”。这种封装不是掩盖原理,而是让原型链更可靠、更易协作。











