当前位置:首页 > JavaScript

js实现钩子

2026-03-15 12:04:42JavaScript

钩子的概念

钩子(Hook)是一种编程模式,允许在特定事件或流程中插入自定义代码逻辑。在JavaScript中,钩子常用于生命周期管理、事件监听或自定义拦截逻辑。

事件监听钩子

通过事件监听机制实现钩子功能,适用于DOM操作或自定义事件场景:

// 自定义事件钩子示例
class EventHook {
  constructor() {
    this.hooks = {};
  }

  register(eventName, callback) {
    if (!this.hooks[eventName]) {
      this.hooks[eventName] = [];
    }
    this.hooks[eventName].push(callback);
  }

  trigger(eventName, ...args) {
    if (this.hooks[eventName]) {
      this.hooks[eventName].forEach(callback => callback(...args));
    }
  }
}

// 使用示例
const hook = new EventHook();
hook.register('beforeSave', () => console.log('数据保存前校验'));
hook.trigger('beforeSave');

生命周期钩子

适用于组件生命周期的场景,常见于前端框架:

// 简易生命周期钩子实现
class Component {
  constructor() {
    this.lifecycleHooks = {
      mounted: [],
      updated: [],
      destroyed: []
    };
  }

  onMounted(cb) {
    this.lifecycleHooks.mounted.push(cb);
  }

  mount() {
    console.log('组件挂载');
    this.lifecycleHooks.mounted.forEach(hook => hook());
  }
}

// 使用示例
const comp = new Component();
comp.onMounted(() => console.log('挂载后执行清理'));
comp.mount();

函数拦截钩子

通过高阶函数实现函数执行前后的钩子逻辑:

// 函数执行前后钩子
function createHook(targetFn) {
  return {
    before(beforeFn) {
      const original = targetFn;
      targetFn = (...args) => {
        beforeFn(...args);
        return original(...args);
      };
    },
    after(afterFn) {
      const original = targetFn;
      targetFn = (...args) => {
        const result = original(...args);
        afterFn(result, ...args);
        return result;
      };
    },
    execute: (...args) => targetFn(...args)
  };
}

// 使用示例
const hookedFn = createHook((x) => x * 2);
hookedFn.before((x) => console.log(`输入值: ${x}`));
hookedFn.after((result) => console.log(`计算结果: ${result}`));
hookedFn.execute(5); // 输出输入值后执行计算

Promise钩子

适用于异步操作的拦截场景:

js实现钩子

// Promise钩子实现
function createPromiseHook(promiseFn) {
  const interceptors = {
    resolve: [],
    reject: []
  };

  return {
    onResolve(cb) {
      interceptors.resolve.push(cb);
    },
    onReject(cb) {
      interceptors.reject.push(cb);
    },
    execute(...args) {
      return promiseFn(...args)
        .then(data => {
          interceptors.resolve.forEach(cb => cb(data));
          return data;
        })
        .catch(err => {
          interceptors.reject.forEach(cb => cb(err));
          throw err;
        });
    }
  };
}

// 使用示例
const apiHook = createPromiseHook(fetch);
apiHook.onResolve(data => console.log('请求成功'));
apiHook.execute('https://api.example.com');

以上实现方式可根据具体需求组合使用,关键是根据业务场景选择合适的钩子类型。在复杂场景中,建议使用成熟的发布订阅库或前端框架内置的钩子系统。

标签: 钩子js
分享给朋友:

相关文章

js实现复制功能

js实现复制功能

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

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js 实现图片轮播

js 实现图片轮播

基础实现方案 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS负责样式布局,JavaScript处理轮播逻辑。 <div class="…