可以通过重写 function.prototype.call、apply 和 bind 方法来拦截函数调用,但会破坏原生语义且存在兼容性风险,仅适用于调试监控等受控场景;需保存原方法并正确转发上下文,bind 拦截需包装返回函数,全局劫持易引发副作用,建议加开关、排除关键函数、包裹 try...catch,并优先采用 proxy 或构建时注入等更安全方案。

可以通过重写 Function.prototype.call、apply 和 bind 方法,来拦截并修改所有函数的调用行为。但需特别注意:直接覆盖原生方法会破坏原有语义,且可能引发兼容性或稳定性问题,仅适合调试、监控等受控场景。
拦截 call 和 apply 调用
这两个方法是函数执行的核心入口,覆盖它们能捕获绝大多数显式调用。
例如添加统一的日志记录:
// 保存原方法
const originalCall = Function.prototype.call;
const originalApply = Function.prototype.apply;
// 替换 call
Function.prototype.call = function(thisArg, ...args) {
console.log(`[call] ${this.name || 'anonymous'} called with`, thisArg, args);
return originalCall.apply(this, [thisArg, ...args]);
};
// 替换 apply
Function.prototype.apply = function(thisArg, argsArray) {
console.log(`[apply] ${this.name || 'anonymous'} applied with`, thisArg, argsArray);
return originalApply.apply(this, [thisArg, argsArray]);
};
⚠️ 注意:this 指向被调用的函数,必须用 originalCall/apply 正确转发,否则会丢失上下文或报错。
小心处理 bind 的返回值
bind 不直接执行函数,而是返回新函数,因此需包装返回的绑定函数,使其后续调用也被拦截。
基本做法:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 保存原始
bind方法 - 拦截调用,返回一个包装后的函数
- 该包装函数在被调用时,再触发自定义逻辑(如日志、权限检查)
const originalBind = Function.prototype.bind;
Function.prototype.bind = function(thisArg, ...bindArgs) {
const targetFn = this;
// 返回一个新函数,它在执行时会先运行拦截逻辑
return function(...callArgs) {
console.log(`[bound call] ${targetFn.name || 'anonymous'} bound to`, thisArg);
return targetFn.apply(thisArg, [...bindArgs, ...callArgs]);
};
};
⚠️ 这种简易实现丢失了原生 bind 的部分特性(如不可构造性、length 属性),生产环境应更严谨地模拟原行为。
避免影响内置函数和关键系统逻辑
全局劫持会作用于所有函数,包括 Promise 构造器、Array.prototype.map 回调、事件处理器等,容易引发意外副作用。
建议策略:
- 加开关控制,仅在开发环境启用
- 排除特定函数名或对象(如
console.log、setTimeout) - 用
try...catch包裹原调用,防止拦截逻辑崩溃导致整个应用挂掉 - 避免在拦截中做耗时或异步操作,防止阻塞主线程
更安全的替代方案
除非必要,不推荐直接改写 Function.prototype。更健壮的做法包括:
- 使用代理(Proxy)包装单个函数对象(适用于可控范围)
- 借助 AST 工具在构建时注入调用钩子(如 Babel 插件)
- 利用浏览器 DevTools 的“黑盒脚本”或性能面板做运行时分析
- 在框架层统一拦截(如 React 的 Profiler、Vue 的 performance hook)
直接污染原型链是高风险操作,应作为最后手段,并充分测试边界情况。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










