class是原型链的语法糖而非替代,本质仍是构造函数,方法挂载到prototype上;原型链模式天然兼容旧环境,零构建成本且可动态修改;class需转译支持、存在tdz、方法不可枚举;混用时须注意constructor修复与__proto__安全设置。

类语法是原型链的语法糖,不是替代关系
JavaScript 中的 class 并未改变底层继承模型,它只是对原型链机制的一层封装。所有通过 class 定义的类,在运行时仍会生成构造函数,并将方法挂载到 prototype 上。例如:
-
class Animal { speak() {} }等价于function Animal() {}; Animal.prototype.speak = function() {}; -
typeof Animal返回'function',说明类本质仍是函数 - 实例的
__proto__依然指向类的prototype,原型链结构完全一致
原型链模式在所有环境中天然兼容
基于构造函数 + prototype + new 的传统模式,不依赖任何新语法特性,因此可在任意支持 JavaScript 的环境(包括 IE9+、Node.js 早期版本、嵌入式 JS 引擎)中直接运行。关键点包括:
- 无需转译,零构建成本
- 可动态修改
prototype,运行时增强行为(如为所有数组添加自定义方法) - 适合需要细粒度控制原型关系的场景,比如实现 mixin 或代理继承
类语法需注意执行环境与转译配置
class 是 ES6+ 特性,其兼容性取决于目标环境是否原生支持,或是否经过正确转译:
- IE 完全不支持
class,即使使用 Babel,也需配置@babel/preset-env并明确指定targets(如{"ie": "11"}) - 类声明存在“暂时性死区”(TDZ),不能像函数声明那样被提升,
new MyClass()必须在class定义之后执行 - 类内部方法默认不可枚举(
Object.keys()不返回它们),而手动挂载到prototype的方法默认可枚举——这点会影响某些反射类逻辑
混合使用时的关键注意事项
在大型项目中,常出现类与原型链混用的情况(如扩展第三方类、修补内置原型),此时需特别注意一致性:
- 用
Object.setPrototypeOf(obj, NewProto)替代直接赋值obj.__proto__ = ...,后者在严格模式下可能报错 - 继承类时若手动操作原型(如
Sub.prototype = Object.create(Super.prototype)),必须同步修复constructor指针,否则instance.constructor会指向错误构造器 - 避免在类中直接修改
prototype(如MyClass.prototype.method = ...),这会破坏类的封装意图,且与静态方法、私有字段等特性产生语义冲突
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











