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,就能拿到标准类型标识。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
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 能帮你在不改写逻辑的前提下适配调用方式。
- 求数组最大值(兼容旧环境):
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(即子类实例),从而继承实例属性。
-
Animal.call(this, name, age)把 name 和 age 挂到子类实例上,而不是挂到 Animal 新实例 - 必须放在子类构造函数首行,确保属性尽早挂载
- 与原型链继承配合:用 call 继承实例属性,用 Object.create(Parent.prototype) 继承原型方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










