当前位置:首页 > 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 可以拦截多种操作,包括但不限于属性访问、赋值、函数调用等。以下是一些常见的拦截操作示例:

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 可以用于实现数据验证,确保对象属性的值符合特定条件。以下是一个简单的数据验证示例:

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 可以用于记录函数的调用情况,包括参数和返回值:

js实现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实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现动画

js实现动画

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

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 jQ…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现防洪

js实现防洪

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