原型继承本身不直接提供高内聚,需通过控制共享范围、隔离状态、明确职责边界来实现:将可变状态放构造函数中私有化,方法挂原型但只操作自身属性,用组合替代深层继承,构造函数统一初始化。

原型继承本身不直接提供高内聚,它是一种“共享引用”机制,天然倾向低内聚——因为子类实例共用父类原型上的方法和属性。要实现高内聚,关键不是放弃原型继承,而是**控制共享范围、隔离状态、明确职责边界**。
避免原型上存放可变状态
高内聚要求每个对象管理自己的数据,不依赖外部共享状态。原型链上若定义引用类型(如数组、对象),所有实例都会共享同一份内存。
- ❌ 错误写法:在父类原型或构造函数中直接赋值引用类型
- ✅ 正确做法:把可变状态(如
colors、info)放在构造函数内,用this初始化,确保每个实例独有一份 - 示例:
function Parent() { this.colors = ['red']; }—— 状态私有化,不污染原型
方法尽量挂载在原型,但保持无状态
把方法定义在原型上,是为了复用和节省内存,这本身符合高内聚的“职责单一”原则:原型只负责行为逻辑,不保管数据。
- 方法内部只操作
this上的数据(即实例自有属性),不读写其他实例或原型上的变量 - 避免在原型方法里修改全局变量、静态属性或兄弟实例的状态
- 例如:
Person.prototype.getName = function() { return this.name; };—— 它只读取自身name,不干扰他人
用组合代替深层原型链
过长的原型链会模糊责任归属,一个方法调用可能跨越多层原型,难以追踪数据来源和修改影响,破坏内聚性。
立即学习“Java免费学习笔记(深入)”;
- 优先用“组合”:让子类实例持有父类实例(
this.parent = new Parent()),而非继承其原型 - 或采用寄生组合式继承,切断不必要的原型链接,只继承真正需要的公有方法
- ES6
class+extends本质仍是原型继承,但语法强制分离构造逻辑与原型方法,更易维护内聚
封装初始化逻辑,统一入口
高内聚还体现在对象创建时的可控性。不要让原型上的方法承担初始化职责,而应集中到构造函数中。
- 构造函数负责设置初始状态、绑定必要上下文、校验参数
- 原型方法只做纯行为:计算、格式化、触发事件等,不改变对象基本结构
- 这样每个实例从诞生起就具备完整、独立、自洽的状态+行为闭环


















