当前位置:首页 > JavaScript

js 实现before

2026-03-14 22:08:40JavaScript

在JavaScript中,可以通过修改原型链或使用高阶函数来实现类似before的功能,即在目标函数执行前插入自定义逻辑。以下是几种实现方法:

通过原型链扩展Function

Function原型添加before方法,允许在调用原函数前执行前置函数:

Function.prototype.before = function(beforeFn) {
    const originalFn = this;
    return function(...args) {
        beforeFn.apply(this, args);
        return originalFn.apply(this, args);
    };
};

// 示例用法
const sayHello = () => console.log("Hello");
const logBefore = () => console.log("About to say hello");

const wrappedFn = sayHello.before(logBefore);
wrappedFn(); // 输出: About to say hello \n Hello

使用高阶函数包装

直接通过函数组合实现前置逻辑,不修改原型:

const before = (beforeFn, originalFn) => (...args) => {
    beforeFn.apply(this, args);
    return originalFn.apply(this, args);
};

// 示例用法
const sayHi = () => console.log("Hi");
const logTime = () => console.log(`Time: ${new Date().toISOString()}`);

const enhancedHi = before(logTime, sayHi);
enhancedHi(); // 输出时间戳后输出 Hi

保留原函数上下文

确保前置函数和原函数共享相同的this上下文:

Function.prototype.before = function(beforeFn) {
    const originalFn = this;
    return function() {
        beforeFn.call(this);
        return originalFn.call(this);
    };
};

// 示例:对象方法调用
const obj = {
    name: "Alice",
    greet: function() { console.log(`My name is ${this.name}`) }
};
obj.logBefore = () => console.log("Starting greeting...");

obj.greet = obj.greet.before(obj.logBefore);
obj.greet(); // 输出前置日志并正确显示name

参数传递处理

显式处理参数传递的场景:

const beforeWithArgs = (beforeFn, mainFn) => (...args) => {
    beforeFn(args);
    return mainFn(args);
};

// 示例
const add = (a, b) => a + b;
const validate = (args) => {
    if (args.some(isNaN)) throw new Error("Invalid numbers");
};

const safeAdd = beforeWithArgs(validate, add);
console.log(safeAdd(2, 3)); // 5

异步场景支持

处理异步前置操作:

Function.prototype.beforeAsync = async function(beforeFn) {
    const originalFn = this;
    return async function(...args) {
        await beforeFn.apply(this, args);
        return originalFn.apply(this, args);
    };
};

// 示例
const fetchData = async () => "Data";
const checkAuth = async () => {
    await new Promise(resolve => setTimeout(resolve, 500));
    console.log("Auth checked");
};

const secureFetch = fetchData.beforeAsync(checkAuth);
secureFetch().then(console.log); // 先检查认证后获取数据

以上方法可根据具体需求选择:

js 实现before

  • 原型链扩展适合需要全局使用的场景
  • 高阶函数适合局部逻辑组合
  • 异步版本适用于Promise链式调用
  • 注意this绑定和参数传递的细节差异

标签: jsbefore
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现拷贝

js实现拷贝

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

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…