当前位置:首页 > 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 陷阱 拦截对象属性的读取操作。

js实现proxy

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 陷阱 拦截函数的调用操作。

js实现proxy

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

日志记录

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

相关文章

js防抖和节流实现

js防抖和节流实现

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

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现选题

js实现选题

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

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…