构建高性能原型链的关键是精准控制原型指向、避免冗余属性和减少查找开销;应优先使用 object.create 创建干净实例,避免可变引用类型共享,慎用 proto 赋值,并控制继承深度以提升属性访问性能。

构建高性能的原型链,关键不在堆砌层级,而在于精准控制原型指向、避免冗余属性、减少查找开销。Object.create 是最直接、最轻量的起点,它不执行构造函数、不污染实例、也不引入不必要的 this 绑定逻辑。
用 Object.create 明确设置原型
Object.create(proto) 创建的新对象,其 __proto__ 直接指向传入的 proto 对象,中间不经过任何构造函数调用。这意味着:
- 没有 new 的初始化开销(如 this 绑定、return 处理等)
- 实例属性干净,不会意外继承构造函数中定义的临时变量
- 原型链结构清晰:子对象 → 父对象 → null(或继续向上)
例如:const rabbit = Object.create(animal); 中,rabbit 的方法和属性全部来自 animal,自身无额外负担。
避免在原型上挂载可变引用类型
如果父原型中存在数组、对象等引用类型属性,所有继承它的实例会共享同一份内存。这会导致意外交互:
- 错误写法:
animal.hobbies = [];→ 所有 rabbit 实例 push 都改同一个数组 - 正确做法:实例专属数据应在构造逻辑中初始化(哪怕手动赋值),如
rabbit.jumps = true; - 共享只用于不可变值或纯函数(如
eat() {})
慎用 __proto__ 直接赋值
虽然 obj.__proto__ = parent 看似简单,但它:
- 不是标准用法,部分环境(如严格模式、旧引擎)可能不支持
- 每次赋值都触发内部原型链重链接,性能不如一次性创建
- 容易掩盖设计意图,不利于维护
推荐统一用 Object.create 建立关系,或通过 Object.setPrototypeOf(仅在必要时动态调整)。
继承链不宜过深
每访问一个属性,JS 引擎都要沿 __proto__ 逐层查找。5 层以上的原型链已明显影响读取性能,尤其在高频调用场景(如动画帧、事件处理):
- 优先扁平化设计:用组合代替多层继承(如把通用行为抽成工具对象,通过属性委托复用)
- 热路径属性尽量放在实例自身或第一层原型上
- 可用
hasOwnProperty或Object.prototype.hasOwnProperty.call(obj, key)快速判断归属层











