当前位置:首页 > JavaScript

js Proxy实现

2026-04-05 17:06:54JavaScript

Proxy 基本概念

Proxy 是 ES6 引入的一个特性,用于创建一个对象的代理,从而拦截和自定义对象的底层操作。通过 Proxy,可以拦截对象的各种操作,如属性读取、属性设置、函数调用等。

创建 Proxy

Proxy 的构造函数接受两个参数:目标对象和处理程序对象。

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

常用拦截操作

get 拦截

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

const handler = {
  get: function(target, prop) {
    console.log(`Reading property ${prop}`);
    return target[prop];
  }
};

set 拦截

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

const handler = {
  set: function(target, prop, value) {
    console.log(`Setting property ${prop} to ${value}`);
    target[prop] = value;
    return true;
  }
};

apply 拦截

拦截函数的调用操作。

const handler = {
  apply: function(target, thisArg, argumentsList) {
    console.log(`Calling function with args: ${argumentsList}`);
    return target.apply(thisArg, argumentsList);
  }
};

construct 拦截

拦截 new 操作符。

const handler = {
  construct: function(target, argumentsList, newTarget) {
    console.log(`Constructing with args: ${argumentsList}`);
    return new target(...argumentsList);
  }
};

实际应用示例

数据验证

const validator = {
  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 person = new Proxy({}, validator);

日志记录

const logger = {
  get: function(target, prop) {
    console.log(`Accessing property: ${prop}`);
    return target[prop];
  },
  set: function(target, prop, value) {
    console.log(`Setting property: ${prop} = ${value}`);
    target[prop] = value;
    return true;
  }
};
const obj = new Proxy({}, logger);

负数组索引

const negativeArray = (array) => {
  return new Proxy(array, {
    get: function(target, prop, receiver) {
      const index = parseInt(prop);
      if (index < 0) {
        prop = target.length + index;
      }
      return Reflect.get(target, prop, receiver);
    }
  });
};
const arr = negativeArray([1, 2, 3]);
console.log(arr[-1]); // 3

注意事项

Proxy 的某些拦截操作需要返回特定值,如 set 操作需要返回布尔值表示是否设置成功。不正确的返回值可能导致错误。

Proxy 只能代理对象,不能代理原始值。如果尝试代理原始值,会抛出 TypeError。

js Proxy实现

Proxy 的拦截操作不是所有对象操作都能捕获,如某些内置方法可能绕过 Proxy 的拦截。

标签: jsProxy
分享给朋友:

相关文章

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…