当前位置:首页 > JavaScript

js实现proxy

2026-02-01 14:24:53JavaScript

使用 Proxy 对象的基本方法

在 JavaScript 中,Proxy 对象用于创建一个对象的代理,从而实现对基本操作的拦截和自定义。Proxy 可以拦截诸如属性读取、属性设置、函数调用等操作。

const target = {
  name: 'John',
  age: 30
};

const handler = {
  get: function(target, prop) {
    return prop in target ? target[prop] : 'Property not found';
  },
  set: function(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(target, handler);
console.log(proxy.name); // 'John'
console.log(proxy.unknown); // 'Property not found'
proxy.age = 35; // 正常设置
proxy.age = 'thirty'; // 抛出 TypeError

拦截不同操作

Proxy 可以拦截多种操作,包括但不限于属性访问、赋值、函数调用等。以下是一些常见的拦截操作示例:

js实现proxy

const handler = {
  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;
  },
  deleteProperty(target, prop) {
    console.log(`Deleting property ${prop}`);
    delete target[prop];
    return true;
  },
  apply(target, thisArg, argumentsList) {
    console.log(`Function called with arguments: ${argumentsList}`);
    return target.apply(thisArg, argumentsList);
  }
};

const obj = { a: 1 };
const proxyObj = new Proxy(obj, handler);
proxyObj.a; // 触发 get
proxyObj.b = 2; // 触发 set
delete proxyObj.a; // 触发 deleteProperty

const func = (x, y) => x + y;
const proxyFunc = new Proxy(func, handler);
proxyFunc(1, 2); // 触发 apply

使用 Proxy 实现数据验证

Proxy 可以用于实现数据验证,确保对象属性的值符合特定条件。以下是一个简单的数据验证示例:

js实现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 > 120) {
        throw new RangeError('Age must be between 0 and 120');
      }
    }
    target[prop] = value;
    return true;
  }
};

const person = new Proxy({}, validator);
person.age = 25; // 正常设置
person.age = 'twenty-five'; // 抛出 TypeError
person.age = 150; // 抛出 RangeError

使用 Proxy 实现私有属性

通过 Proxy 可以模拟私有属性,防止外部直接访问或修改某些属性:

const privateProps = new WeakMap();

const handler = {
  get(target, prop) {
    if (prop.startsWith('_')) {
      throw new Error(`Access to private property ${prop} is denied`);
    }
    return target[prop];
  },
  set(target, prop, value) {
    if (prop.startsWith('_')) {
      throw new Error(`Modification of private property ${prop} is denied`);
    }
    target[prop] = value;
    return true;
  }
};

const obj = { publicProp: 'public', _privateProp: 'private' };
const proxy = new Proxy(obj, handler);
console.log(proxy.publicProp); // 'public'
console.log(proxy._privateProp); // 抛出 Error
proxy._privateProp = 'new value'; // 抛出 Error

使用 Proxy 实现函数调用的日志记录

Proxy 可以用于记录函数的调用情况,包括参数和返回值:

function logFunctionCalls(target) {
  return new Proxy(target, {
    apply(target, thisArg, argumentsList) {
      console.log(`Function called with arguments: ${argumentsList}`);
      const result = target.apply(thisArg, argumentsList);
      console.log(`Function returned: ${result}`);
      return result;
    }
  });
}

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

const loggedAdd = logFunctionCalls(add);
loggedAdd(2, 3); // 记录调用和返回值

标签: jsproxy
分享给朋友:

相关文章

js实现选项卡

js实现选项卡

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

js实现论坛

js实现论坛

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

js实现延迟

js实现延迟

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

js 实现跳转

js 实现跳转

使用 window.location.href 进行跳转 通过修改 window.location.href 可以跳转到指定 URL,浏览器会加载新页面: window.location.hre…

js实现左右滑动

js实现左右滑动

实现左右滑动的 JavaScript 方法 监听触摸事件 通过 touchstart、touchmove 和 touchend 事件来检测用户的手势操作。记录触摸的起始位置和移动距离,判断滑动方向。…

js实现复选框

js实现复选框

实现复选框的基本方法 使用HTML的<input type="checkbox">元素创建复选框,并通过JavaScript监听其状态变化。 <input type="checkb…