类与构造函数均基于原型继承,class是语法糖,两者原型链机制相同,但class通过extends和super简化了继承写法,静态成员处理上class支持自动继承而构造函数需手动实现。

JavaScript 中实现对象创建和继承的方式多种多样,其中“类”与“构造函数 + 原型”的方式最为常见。虽然 ES6 引入了 class 语法让 JavaScript 看起来更像传统面向对象语言,但其底层机制依然基于原型继承。本文将深入对比类与构造函数在实现继承时的异同,帮助理解其本质。
类的本质仍是构造函数
ES6 的 class 并非全新的对象模型,而是现有原型继承的语法糖。定义一个类实际上是在创建一个可调用的函数(即构造函数)。
- 使用 class Person {} 定义的类,其类型是 "function"
- Person.prototype 包含实例方法,和构造函数模式一致
- 类中的 constructor 方法对应传统构造函数的初始化逻辑
继承机制的实现方式对比
无论是 class 还是构造函数,继承都依赖原型链,但写法差异明显。
构造函数实现继承:
立即学习“Java免费学习笔记(深入)”;
- 需手动调用父构造函数(如 Parent.call(this))实现属性继承
- 通过 Child.prototype = Object.create(Parent.prototype) 建立原型链
- 必须重置 constructor 指向:Child.prototype.constructor = Child
- 代码冗长,容易遗漏关键步骤
class 实现继承:
- 使用 extends 关键字直接声明继承关系
- 子类 constructor 中调用 super() 初始化父类属性
- 原型链自动设置,无需手动操作
- 语法清晰,减少出错概率
原型链的工作原理一致
无论使用哪种方式,实例访问属性时的查找机制完全相同:先查自身,再沿 __proto__ 向上查找原型链,直到 Object.prototype 或 null。
- class 创建的实例,其 __proto__ 指向类的 prototype
- 构造函数创建的实例,其 __proto__ 指向构造函数的 prototype
- 两者最终都依赖 prototype 对象共享方法
静态成员的处理方式
静态方法和属性不被实例继承,而是通过构造器本身传递。
- 构造函数通过直接赋值添加静态成员:Constructor.staticMethod = function(){}
- class 使用 static 关键字声明静态方法或属性
- 继承时,class 的 static 成员也会被子类继承(通过构造器的原型链)
- 构造函数需手动复制或利用寄生组合式继承处理静态成员
基本上就这些。class 让原型继承更直观,但理解构造函数和原型链仍是掌握 JavaScript 继承的关键。两种方式底层运行机制一致,选择取决于团队规范和可维护性需求。










