当前位置:首页 > JavaScript

js实现函数监听

2026-03-16 03:11:56JavaScript

函数监听的基本概念

函数监听通常指在特定函数执行前后插入自定义逻辑,常用于调试、性能分析或扩展功能。JavaScript中可以通过多种方式实现函数监听。

使用装饰器模式

装饰器模式允许在不修改原函数代码的情况下扩展功能。ES6引入的装饰器语法糖可以简化这一过程。

js实现函数监听

function logDecorator(target, name, descriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function(...args) {
    console.log(`Calling ${name} with args:`, args);
    const result = originalMethod.apply(this, args);
    console.log(`Called ${name}, result:`, result);
    return result;
  };
  return descriptor;
}

class Example {
  @logDecorator
  sum(a, b) {
    return a + b;
  }
}

使用Proxy对象

Proxy可以拦截目标对象的操作,包括函数调用。

const handler = {
  apply: function(target, thisArg, argumentsList) {
    console.log(`Function called with args: ${argumentsList}`);
    return target.apply(thisArg, argumentsList);
  }
};

const originalFunction = function(a, b) { return a + b; };
const proxiedFunction = new Proxy(originalFunction, handler);

直接包装函数

对于简单场景,可以直接包装原函数实现监听。

js实现函数监听

function listen(fn, callback) {
  return function(...args) {
    callback('before', args);
    const result = fn.apply(this, args);
    callback('after', result);
    return result;
  };
}

const monitoredFn = listen(
  (a, b) => a + b,
  (event, data) => console.log(event, data)
);

事件发射器模式

通过事件发射器实现更复杂的监听机制。

const EventEmitter = require('events');

class ObservableFunction extends EventEmitter {
  constructor(fn) {
    super();
    this.fn = fn;
  }

  execute(...args) {
    this.emit('beforeExecute', args);
    const result = this.fn(...args);
    this.emit('afterExecute', result);
    return result;
  }
}

const observable = new ObservableFunction((a, b) => a + b);
observable.on('beforeExecute', args => console.log('Before:', args));
observable.on('afterExecute', result => console.log('After:', result));

浏览器环境下的全局函数监听

在浏览器中可能需要监听全局函数调用。

const originalAlert = window.alert;
window.alert = function(message) {
  console.log('Alert called with:', message);
  return originalAlert.call(window, message);
};

每种方法适用于不同场景,装饰器适合类方法,Proxy提供更细粒度控制,直接包装简单易用,事件发射器适合复杂交互,全局替换适用于浏览器环境。选择时需考虑兼容性需求和功能复杂度。

标签: 函数js
分享给朋友:

相关文章

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

uniapp如何写全局函数

uniapp如何写全局函数

全局函数的定义与使用 在UniApp中定义全局函数可以通过挂载到Vue.prototype或使用模块化导出导入的方式实现。以下是两种常用方法: 方法一:挂载到Vue.prototype 在main.…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…