JavaScript原型继承的关键在于安全、清晰、可维护地使用:优先用ES6 class封装逻辑,避免污染内置原型,推荐组合优于多层继承,重设prototype后须修正constructor。

JavaScript原型继承不是“选不选”的问题,而是“怎么用才安全、清晰、可维护”的问题。核心原则是:优先用现代语法封装逻辑,谨慎操作原型链,避免直接污染或过度依赖隐式委托。
用ES6 class语法代替手写原型链
class不是新继承模型,而是构造函数+原型操作的语法糖,但它强制规范了继承结构,减少出错可能。
- 用
extends明确父子关系,super()确保父类构造逻辑执行 - 方法自动定义在父类/子类的
prototype上,无需手动赋值Child.prototype = Object.create(Parent.prototype) - 静态方法、getter/setter、私有字段(#field)都天然支持,避免手动模拟带来的混乱
避免直接修改内置原型或他人对象的__proto__
给Array.prototype或Object.prototype加方法看似方便,但极易引发冲突;直接改__proto__会破坏对象初始设计,且在严格模式下可能报错。
- 需要复用逻辑时,用工具函数或独立模块封装,比如
isArrayLike(obj)而不是往Object.prototype塞isLikeArray() - 若必须扩展原型(如Polyfill),先检测原生是否存在,再用
Object.defineProperty控制属性可枚举性与可写性 - 创建新对象时,优先用
Object.create(proto)指定原型,而不是事后改__proto__
组合优于继承,尤其避免多层原型链嵌套
深层原型链(如A→B→C→Object.prototype)会让属性查找变慢,调试困难,且语义模糊——一个对象“是什么”不如“能做什么”重要。
立即学习“Java免费学习笔记(深入)”;
- 把通用行为抽成独立对象或函数,通过属性挂载或方法调用复用,例如
const logger = createLogger(); obj.logger = logger; - 用
Object.assign()或Object.setPrototypeOf()临时委托行为,比长期继承更灵活 - 组件开发中,用mixins或装饰器模式注入能力,而不是靠层层继承堆叠职责
理解constructor和prototype的对应关系,别让它们脱钩
手动设置Child.prototype = new Parent()后,Child.prototype.constructor会指向Parent,这会导致instance.constructor === Parent,破坏类型识别。
- 每次重设
prototype后,显式修正constructor:Child.prototype.constructor = Child - 更稳妥的做法是用
Object.create(Parent.prototype)替代new Parent(),避免父类构造函数副作用,再设constructor - 检查实例类型时,优先用
instanceof或Object.getPrototypeOf(obj) === Class.prototype,而非依赖constructor


















