call方法可借用数组方法处理类数组对象、安全检测数据类型、调用内置函数、实现继承中父构造函数逻辑复用。

借用数组方法处理类数组对象
类数组对象(如 arguments、NodeList、HTMLCollection)有数字索引和 length 属性,但没有 slice、forEach、push 等数组方法。用 call 可以临时把 Array.prototype 上的方法“借”过来执行。
- 把 arguments 转成真数组:
Array.prototype.slice.call(arguments)或简写为[].slice.call(arguments) - 遍历 DOM 节点列表:
Array.prototype.forEach.call(document.querySelectorAll('div'), el => el.classList.add('active')) - 向类数组添加元素(要求 length 可写):
Array.prototype.push.call({0: 'a', 1: 'b', length: 2}, 'c')→ 得到{0:'a', 1:'b', 2:'c', length:3}
安全检测数据类型
实例可能重写自己的 toString 方法,导致 obj.toString() 返回不可靠结果。绕过重写,直接调用原始的 Object.prototype.toString,就能拿到标准类型标识。
-
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call(null)→"[object Null]" -
Object.prototype.toString.call(/abc/)→"[object RegExp]" - 配合 slice 提取类型名:
Object.prototype.toString.call(42).slice(8, -1)→"Number"
调用内置构造函数或数学方法
部分内置函数设计为只接受特定参数形式,call 能帮你在不改写逻辑的前提下适配调用方式。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 求数组最大值(兼容旧环境):
Math.max.call(null, 1, 2, 3)或Math.max.apply(null, [1, 2, 3]);现代写法可用展开运算符,但 call 在需动态拼参且不生成中间数组时更轻量 - 字符串转大写并绑定上下文(虽少用但可行):
String.prototype.toUpperCase.call('hello')→"HELLO";注意字符串是原始值,call 会自动包装为 String 实例 - 显式调用 Function.prototype.bind 的底层行为(调试或手写 polyfill 时):
Function.prototype.bind.call(fn, thisArg, ...args)
在继承中复用父构造函数逻辑
子类构造函数中调用父类构造函数,不是为了创建新对象,而是让父类初始化逻辑作用于当前 this(即子类实例),从而继承实例属性。
立即学习“Java免费学习笔记(深入)”;
-
Animal.call(this, name, age)把 name 和 age 挂到子类实例上,而不是挂到 Animal 新实例 - 必须放在子类构造函数首行,确保属性尽早挂载
- 与原型链继承配合:用 call 继承实例属性,用 Object.create(Parent.prototype) 继承原型方法

















