当前位置:首页 > JavaScript

js实现切面

2026-01-31 20:38:54JavaScript

在JavaScript中实现切面编程(AOP)可以通过高阶函数、装饰器或Proxy等方式实现。以下是几种常见方法:

使用高阶函数

通过包装原函数,在调用前后插入额外逻辑:

js实现切面

function withLogging(fn) {
  return function(...args) {
    console.log(`Entering ${fn.name}`);
    const result = fn.apply(this, args);
    console.log(`Exiting ${fn.name}`);
    return result;
  };
}

function sayHello(name) {
  console.log(`Hello, ${name}`);
}

const wrappedSayHello = withLogging(sayHello);
wrappedSayHello("World");

使用ES7装饰器

在支持装饰器的环境中(如Babel或TypeScript),可以直接修饰方法:

js实现切面

function log(target, name, descriptor) {
  const original = descriptor.value;
  descriptor.value = function(...args) {
    console.log(`Calling ${name} with`, args);
    return original.apply(this, args);
  };
  return descriptor;
}

class MyClass {
  @log
  greet(name) {
    console.log(`Hello ${name}`);
  }
}

使用Proxy对象

通过Proxy拦截对象操作:

const handler = {
  get(target, prop, receiver) {
    const original = target[prop];
    if (typeof original === 'function') {
      return function(...args) {
        console.log(`Before ${prop}`);
        const result = original.apply(this, args);
        console.log(`After ${prop}`);
        return result;
      };
    }
    return original;
  }
};

const obj = {
  sayHi(name) {
    console.log(`Hi ${name}`);
  }
};

const proxied = new Proxy(obj, handler);
proxied.sayHi('Proxy');

修改原型方法

直接修改Function原型实现AOP:

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

Function.prototype.after = function(afterFn) {
  return (...args) => {
    const result = this.apply(this, args);
    afterFn.apply(this, args);
    return result;
  };
};

function test() {
  console.log('test');
}

test.before(() => console.log('before')).after(() => console.log('after'))();

这些方法各有适用场景:高阶函数适合简单函数包装,装饰器适合类方法,Proxy适合复杂对象拦截,原型修改则会影响所有函数。选择时需考虑项目环境和需求。

标签: 切面js
分享给朋友:

相关文章

js实现动画

js实现动画

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

js实现拖拽

js实现拖拽

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

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…