当前位置:首页 > JavaScript

js实现proxy

2026-03-14 13:20:39JavaScript

JavaScript 实现 Proxy

Proxy 是 JavaScript 中的一个强大特性,用于创建一个对象的代理,从而可以拦截和自定义对象的基本操作。以下是 Proxy 的基本实现方法和常见用法。

基本语法

Proxy 的构造函数接受两个参数:目标对象和处理程序对象。处理程序对象包含一组“陷阱”(traps),用于拦截对目标对象的操作。

const target = {};
const handler = {
  get: function(target, property, receiver) {
    return property in target ? target[property] : 'default';
  }
};
const proxy = new Proxy(target, handler);

常见拦截操作

Proxy 可以拦截多种操作,以下是一些常见的陷阱方法:

get 陷阱 拦截对象属性的读取操作。

const handler = {
  get(target, prop) {
    return prop === 'name' ? 'Proxy User' : target[prop];
  }
};
const proxy = new Proxy({}, handler);
console.log(proxy.name); // 输出: Proxy User

set 陷阱 拦截对象属性的设置操作。

const handler = {
  set(target, prop, value) {
    if (prop === 'age' && typeof value !== 'number') {
      throw new TypeError('Age must be a number');
    }
    target[prop] = value;
    return true;
  }
};
const proxy = new Proxy({}, handler);
proxy.age = 25; // 正常
proxy.age = '25'; // 抛出 TypeError

apply 陷阱 拦截函数的调用操作。

const handler = {
  apply(target, thisArg, argumentsList) {
    console.log(`Called with args: ${argumentsList}`);
    return target.apply(thisArg, argumentsList);
  }
};
function sum(a, b) {
  return a + b;
}
const proxy = new Proxy(sum, handler);
console.log(proxy(1, 2)); // 输出: Called with args: 1,2 然后输出 3

实际应用示例

Proxy 可以用于数据验证、日志记录、性能监控等场景。

数据验证

const validator = {
  set(target, prop, value) {
    if (prop === 'age') {
      if (!Number.isInteger(value)) {
        throw new TypeError('Age must be an integer');
      }
      if (value < 0 || value > 150) {
        throw new RangeError('Age must be between 0 and 150');
      }
    }
    target[prop] = value;
    return true;
  }
};
const person = new Proxy({}, validator);
person.age = 30; // 正常
person.age = 'thirty'; // 抛出 TypeError

日志记录

js实现proxy

const logger = {
  get(target, prop) {
    console.log(`Getting property "${prop}"`);
    return target[prop];
  },
  set(target, prop, value) {
    console.log(`Setting property "${prop}" to "${value}"`);
    target[prop] = value;
    return true;
  }
};
const obj = new Proxy({}, logger);
obj.name = 'Alice'; // 输出: Setting property "name" to "Alice"
console.log(obj.name); // 输出: Getting property "name" 然后输出 Alice

注意事项

  • Proxy 的陷阱方法必须返回正确的值,否则可能导致错误。例如,set 陷阱必须返回一个布尔值。
  • Proxy 不会改变原始对象的行为,只是通过代理对象拦截操作。
  • 某些操作可能无法被拦截,例如使用 Object.keys()for...in 循环。

Proxy 提供了一种灵活的方式来控制和扩展对象的行为,适用于多种高级编程场景。

标签: jsproxy
分享给朋友:

相关文章

proxy实现vue

proxy实现vue

使用 Proxy 实现 Vue 响应式系统 Vue 3 的响应式系统基于 JavaScript 的 Proxy API,通过代理对象实现对属性的拦截和依赖追踪。以下是实现的核心逻辑: 创建响应式对象…

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现全选

js实现全选

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

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…