当前位置:首页 > JavaScript

js实现函数监听

2026-03-16 03:11:56JavaScript

函数监听的基本概念

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

使用装饰器模式

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

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);

直接包装函数

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

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));

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

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

js实现函数监听

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

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

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

相关文章

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

react如何使用函数

react如何使用函数

使用函数组件的基本语法 在React中,函数组件是通过JavaScript函数定义的组件。函数接收props作为参数,并返回React元素。 function Welcome(props) {…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…

js实现图片放大

js实现图片放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性实现图片放大效果。当鼠标悬停时,图片会平滑放大。 const img = document…