原型式继承不直接支持懒加载,需通过getter封装属性级延迟初始化、函数+缓存实现方法级懒加载,或结合object.create构建惰性原型,同时注意避免副作用、竞态与引用污染等陷阱。

原型式继承本身不直接支持懒加载,懒加载是设计策略,不是继承机制自带的能力。关键在于把需要延迟初始化的属性或方法,封装成 getter 或函数调用,在首次访问时才创建并缓存结果。
用 getter 实现属性级懒加载
在原型对象上定义 getter,首次读取时执行初始化逻辑,并将结果写入实例自身,后续访问直接返回缓存值。
- 利用 Object.defineProperty 在原型上添加 getter,内部检查实例是否已有该属性,没有则计算并赋值
- 避免重复初始化:一旦值被写入实例,getter 就不会再触发
- 示例:一个依赖 heavyCalculation() 的 data 属性,只在第一次访问 this.data 时运行
用函数封装 + 缓存实现方法级懒加载
把耗时操作包装成方法,内部维护私有缓存(如闭包变量或 WeakMap),首次调用时执行并保存结果。
- 适合不能直接挂到原型上的场景,比如需要闭包隔离或避免污染实例属性
- WeakMap 可以安全地以实例为键存储私有缓存,不影响垃圾回收
- 调用时判断缓存是否存在,不存在则执行初始化并缓存
结合 Object.create 做原型链懒加载
在基于 Object.create 的原型继承中,可让子对象的原型指向一个“惰性原型”——它的属性由 getter 提供,且只在子实例首次访问时才构建完整原型结构。
- 例如:父原型不直接包含大对象,而是提供一个 getter,返回动态创建的对象实例
- 子实例访问 this.config 时,才创建 config 对象并绑定到自身,不影响其他实例
- 注意不要在 getter 中修改原型本身,否则会影响所有共享该原型的对象
避免常见陷阱
懒加载容易误用导致状态混乱或性能反效果。
- 不要在 getter 中执行副作用过大的操作(如发请求、改全局状态),除非明确需要且可控
- 确保缓存逻辑线程安全(单线程 JS 通常没问题,但异步场景需注意 race condition)
- 避免 getter 返回引用类型时被意外修改,必要时做浅拷贝或冻结
- 原型上的 getter 无法被 for...in 遍历到,若需枚举,得配合 configurable: true 和手动管理











