当前位置:首页 > JavaScript

js实现钩子

2026-03-15 12:04:42JavaScript

钩子的概念

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

事件监听钩子

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

js实现钩子

// 自定义事件钩子示例
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');

生命周期钩子

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

js实现钩子

// 简易生命周期钩子实现
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钩子

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

// 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 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…