当前位置:首页 > JavaScript

js 实现hook

2026-03-15 03:32:44JavaScript

在 JavaScript 中实现 Hook

Hook 是一种在函数执行前后插入自定义逻辑的技术,常用于拦截或增强原有功能。以下是几种实现 Hook 的方法:

使用高阶函数包装

通过高阶函数包裹目标函数,在调用前后添加逻辑:

function withHook(originalFunc, beforeHook, afterHook) {
  return function(...args) {
    if (beforeHook) beforeHook(...args);
    const result = originalFunc.apply(this, args);
    if (afterHook) afterHook(result, ...args);
    return result;
  };
}

// 示例用法
const hookedFunc = withHook(
  (a, b) => a + b,
  (a, b) => console.log(`Before add: ${a}, ${b}`),
  (result) => console.log(`After add: ${result}`)
);
hookedFunc(2, 3); // 输出日志并返回5

使用 Proxy 拦截

ES6 Proxy 可以拦截对象属性的访问和调用:

function createHookProxy(target, hooks) {
  return new Proxy(target, {
    apply: function(target, thisArg, args) {
      if (hooks.before) hooks.before.apply(thisArg, args);
      const result = target.apply(thisArg, args);
      if (hooks.after) hooks.after.call(thisArg, result);
      return result;
    }
  });
}

// 示例用法
const hooked = createHookProxy(Math.max, {
  before: (...args) => console.log('Max called with:', args),
  after: (result) => console.log('Max result:', result)
});
hooked(1, 2, 3); // 输出调用参数和结果

修改原型方法

直接修改原型方法实现全局 Hook:

const oldFetch = window.fetch;
window.fetch = async function(...args) {
  console.log('Fetching:', args[0]);
  const response = await oldFetch.apply(this, args);
  console.log('Fetch complete:', response.status);
  return response;
};

React Hooks 实现

在 React 中可以使用自定义 Hook 复用状态逻辑:

js 实现hook

import { useState, useEffect } from 'react';

function useWindowSize() {
  const [size, setSize] = useState({
    width: window.innerWidth,
    height: window.innerHeight
  });

  useEffect(() => {
    const handleResize = () => {
      setSize({
        width: window.innerWidth,
        height: window.innerHeight
      });
    };
    window.addEventListener('resize', handleResize);
    return () => window.removeEventListener('resize', handleResize);
  }, []);

  return size;
}

// 组件中使用
function MyComponent() {
  const { width, height } = useWindowSize();
  return <div>Window size: {width}x{height}</div>;
}

注意事项

  • 确保 Hook 逻辑不会显著影响性能
  • 保持 Hook 的纯净性,避免副作用
  • 在修改原生方法时考虑兼容性和潜在冲突
  • 对于异步函数需要正确处理 Promise 链

标签: jshook
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…