JavaScript中的“伪类”本质是用构造函数+原型链模拟类行为,非真正类:构造函数初始化实例属性,原型定义共享方法,继承通过子类原型指向父类实例实现,并需手动修复constructor。

JavaScript 中的“伪类”架构,本质是用函数模拟传统面向对象语言中的 class 行为,不依赖 ES6 的 class 语法,而是通过构造函数 + 原型链 + 手动绑定继承关系来组织代码。它不是真正意义上的类,但能提供接近类的结构感和复用能力。
核心思路:构造函数定义实例属性,原型定义共享方法
伪类模式把“类”的职责拆开:
- 构造函数(如
function Cat(name) { this.name = name; })负责初始化每个实例独有的数据; - 原型对象(
Cat.prototype)负责存放所有实例共用的方法和可继承的属性; - 继承靠的是让子类原型指向父类的一个实例(
Sub.prototype = new Super();),从而建立原型链查找路径。
实现继承的关键步骤
以 Mammal 为父类、Cat 为子类为例:
- 先定义父类构造函数和它的原型方法(如
says()); - 定义子类构造函数,并在其中调用
Super.call(this, ...)来继承父类的实例属性; - 用
Sub.prototype = new Super();替换子类原型,使其能访问父类原型上的方法; - 手动修复
constructor指针:Sub.prototype.constructor = Sub;,避免混淆; - 再往
Sub.prototype上添加子类专属方法(如purr())。
常见封装技巧:method 和 inherits 辅助方法
为减少重复操作,常会预先定义工具方法:
立即学习“Java免费学习笔记(深入)”;
-
Function.prototype.method = function(name, func) { this.prototype[name] = func; return this; };—— 方便链式添加原型方法; -
Function.prototype.inherits = function(Parent) { this.prototype = new Parent(); return this; };—— 简化原型替换逻辑; - 之后可写成:
var Cat = function(name) { ... }.inherits(Mammal).method('purr', ...).method('get_name', ...);
必须注意的陷阱
伪类看似简洁,但有几处容易出错:
-
忘记 new 调用构造函数:会导致
this指向全局对象,污染环境; - 没有私有作用域:所有属性和方法都是公开的,无法隐藏内部状态;
-
无法直接调用父类方法:不像
super.says()那样明确,需手动保存父类引用或用Parent.prototype.says.call(this); - 引用类型属性被共享:若父类构造函数中定义了数组、对象等,所有子类实例会共用同一份,需配合借用构造函数解决。


















