当前位置:首页 > JavaScript

纯js实现代理

2026-04-04 16:38:40JavaScript

纯 JavaScript 实现代理

在 JavaScript 中,可以使用 Proxy 对象来创建代理,用于拦截和自定义对象的基本操作。Proxy 允许拦截对象的属性访问、赋值、枚举等操作。

基本代理实现

创建一个简单的代理,拦截对象的属性访问和赋值操作:

const target = {
  name: 'Alice',
  age: 25
};

const handler = {
  get(target, property) {
    console.log(`访问属性: ${property}`);
    return target[property];
  },
  set(target, property, value) {
    console.log(`设置属性: ${property} = ${value}`);
    target[property] = value;
    return true;
  }
};

const proxy = new Proxy(target, handler);

console.log(proxy.name); // 访问属性: name → Alice
proxy.age = 30; // 设置属性: age = 30

拦截更多操作

Proxy 可以拦截多种操作,例如 deletePropertyhasin 操作符)、ownKeysObject.keys)等:

const handler = {
  get(target, prop) {
    if (prop in target) {
      return target[prop];
    }
    return `属性 ${prop} 不存在`;
  },
  deleteProperty(target, prop) {
    console.log(`删除属性: ${prop}`);
    delete target[prop];
    return true;
  },
  has(target, prop) {
    console.log(`检查属性是否存在: ${prop}`);
    return prop in target;
  }
};

const proxy = new Proxy({ name: 'Bob' }, handler);

console.log(proxy.age); // 属性 age 不存在
delete proxy.name; // 删除属性: name
console.log('name' in proxy); // 检查属性是否存在: name → false

函数代理

Proxy 也可以代理函数,拦截函数的调用操作:

const handler = {
  apply(target, thisArg, argumentsList) {
    console.log(`调用函数,参数: ${argumentsList}`);
    return target(...argumentsList) * 2;
  }
};

function sum(a, b) {
  return a + b;
}

const proxy = new Proxy(sum, handler);

console.log(proxy(2, 3)); // 调用函数,参数: 2,3 → 10

验证代理

代理可以用于验证对象的属性赋值,例如确保年龄是正数:

const validator = {
  set(target, prop, value) {
    if (prop === 'age') {
      if (typeof value !== 'number' || value <= 0) {
        throw new Error('年龄必须是正数');
      }
    }
    target[prop] = value;
    return true;
  }
};

const person = new Proxy({}, validator);

person.age = 25; // 正常
person.age = -5; // 抛出错误: 年龄必须是正数

代理的撤销

Proxy.revocable 可以创建一个可撤销的代理,后续可以通过调用 revoke 方法撤销代理:

const { proxy, revoke } = Proxy.revocable({ name: 'Charlie' }, {
  get(target, prop) {
    return `属性 ${prop}: ${target[prop]}`;
  }
});

console.log(proxy.name); // 属性 name: Charlie
revoke();
console.log(proxy.name); // 抛出错误: Cannot perform 'get' on a proxy that has been revoked

实际应用场景

代理在实际开发中有多种用途,例如:

纯js实现代理

  • 数据验证和格式化
  • 日志记录和调试
  • 性能监控
  • 实现观察者模式
const observable = (obj) => {
  return new Proxy(obj, {
    set(target, prop, value) {
      console.log(`属性 ${prop} 从 ${target[prop]} 变为 ${value}`);
      target[prop] = value;
      return true;
    }
  });
};

const user = observable({ name: 'Dave' });
user.name = 'Eve'; // 属性 name 从 Dave 变为 Eve

通过 Proxy,可以灵活地拦截和自定义对象的操作,为 JavaScript 开发提供更多可能性。

标签: js
分享给朋友:

相关文章

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…