当前位置:首页 > JavaScript

js 实现hook

2026-03-15 03:32:44JavaScript

在 JavaScript 中实现 Hook

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

使用高阶函数包装

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

js 实现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 可以拦截对象属性的访问和调用:

js 实现hook

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 复用状态逻辑:

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
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现文件下载

js实现文件下载

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

js防抖和节流实现

js防抖和节流实现

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

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现祖玛

js实现祖玛

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

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…