借用原型方法可提升运行效率:绕过构造函数开销、复用逻辑、减少内存占用、利用引擎优化;适用于类数组对象处理、Object.create 创建轻量对象、方法挂载原型共享、组合继承分离实例与共享属性。

借用原型方法提升运行效率,关键在于绕过构造函数初始化开销、复用已定义逻辑、减少内存占用,并利用引擎对原型链的访问优化。它不依赖 new 实例化流程,而是直接调用原型上的方法,把任意对象“临时当作”该类型来使用。
直接调用 Array.prototype 方法处理类数组
类数组对象(如 arguments、NodeList、HTMLCollection)有 length 和数字索引,但不是 Array 实例,不能直接用 slice、forEach 等方法。此时可借用原型方法:
- Array.prototype.slice.call(arguments, 1) —— 快速截取参数,不创建新数组实例,避免构造函数执行
- Array.prototype.forEach.call(document.querySelectorAll('button'), handler) —— 直接遍历节点列表,跳过转成真数组的中间步骤
- 相比 Array.from() 或扩展运算符,call 方式更轻量,尤其在循环频繁或数据量大时优势明显
用 Object.create 避免重复构造开销
当需要大量结构相似的对象(如配置模板、组件实例),不必每次都走完整构造函数流程:
- 定义一个基础原型对象:const baseConfig = { timeout: 5000, retry: 3 };
- 用 Object.create(baseConfig) 创建新对象,其 [[Prototype]] 直接指向 baseConfig
- 新对象不执行任何构造函数,不初始化冗余属性,查找属性时自然沿原型链向上,且共享基础字段
- 比 new Config() 少了 this 绑定、属性赋值、闭包创建等步骤,启动更快、内存更省
动态挂载方法到 prototype 实现运行时复用
方法写在原型上,所有实例自动获得,且只存一份函数体:
立即学习“Java免费学习笔记(深入)”;
- 若在构造函数内写 this.render = function() {...},每个实例都生成独立函数,p1.render === p2.render 为 false
- 改为 Component.prototype.render = function() {...} 后,所有实例共享同一函数引用,=== 返回 true,节省内存
- V8 引擎会对原型链上的方法调用做内联缓存(IC),多次调用后性能接近直接访问本地属性
- 后续还可随时向 prototype 添加新方法,已有实例立即可用,无需重建或重赋值
组合继承中精准分离实例属性与共享方法
借用构造函数 + 原型链继承的组合模式,是兼顾效率与语义的最佳实践:
- 在子构造函数中用 Parent.call(this, ...) 获取独立的实例属性(如 this.colors = ['red']),避免引用类型被共享
- 用 Child.prototype = Object.create(Parent.prototype) 建立原型链,让 sayName 等方法由所有 Child 实例共用
- 既防止了原型链继承的属性污染问题,又规避了纯借用构造函数导致的方法重复创建
- 引擎能分别优化实例属性的快速访问和原型方法的链式查找,整体执行更稳定高效


















