JavaScript方法借用本质是临时让对象使用他人方法,关键在控制this指向;常用call/apply(立即执行,参数形式不同)、bind(返回预绑定函数);还可借用内置方法处理类数组;常见错误是this未正确绑定。

JavaScript 中方法借用,本质是让一个对象“临时使用”另一个对象的方法,关键是控制 this 指向。它不复制方法,也不修改原对象,只是在调用时把目标对象作为上下文传进去。
用 call 或 apply 借用方法
这是最常用、最直接的方式。两者区别只在于参数传递形式:call 用逗号分隔,apply 用数组。
-
call(target, arg1, arg2, ...):把当前方法的
this绑定到target,并立即执行 - apply(target, [arg1, arg2, ...]):功能同 call,但第二个参数必须是数组(或类数组)
例如:
const cat = { food: 'fish', speak() { return `I love ${this.food}`; } };<br>const dog = { food: 'bone' };<br><br>cat.speak.call(dog); // "I love bone"<br>cat.speak.apply(dog); // 同上<br>cat.speak.apply(dog, []); // 无参数时也成立
用 bind 预绑定再调用
bind 不立即执行,而是返回一个新函数,其 this 被永久绑定到指定对象。适合需要多次复用、或延迟调用的场景。
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 返回的函数可保存、传递、后续调用
- 原方法逻辑不变,只是上下文被固化
例如:
const logger = { prefix: '[INFO]', log(msg) { console.log(this.prefix + ': ' + msg); } };<br>const errorLogger = logger.log.bind({ prefix: '[ERROR]' });<br><br>errorLogger('file not found'); // "[ERROR]: file not found"
借用内置方法处理类数组或特殊对象
很多原生方法(如 Array.prototype.slice、Array.prototype.forEach)本只能用于数组,但可通过借用扩展到类数组(如 arguments、NodeList)。
-
Array.prototype.slice.call(arguments)把arguments转成真数组 -
[].forEach.call(document.querySelectorAll('div'), fn)遍历节点列表
注意:ES6 后推荐用 Array.from() 或展开运算符替代,但理解借用原理对调试旧代码仍有价值。
借用时 this 指向错误的常见原因
方法借用失败,往往不是语法错,而是 this 没对上。典型情况包括:
- 直接赋值后调用:
const fn = obj.method; fn();→ 此时this是undefined(严格模式)或全局对象 - 作为回调传入:
button.addEventListener('click', obj.handleClick);→ 点击时this指向 button,不是 obj - 箭头函数无法被 call/apply 改变
this,因为它没有自己的this绑定
解决方式就是显式用 call、apply 或 bind 控制上下文,或改用箭头函数包裹(若需保持外层 this)。

















