当前位置:首页 > 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 拦截

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

js Proxy实现

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 拦截

拦截函数的调用操作。

js Proxy实现

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。

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

标签: jsProxy
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现轮播

js实现轮播

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

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…

js实现复选框

js实现复选框

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

js 实现mvc

js 实现mvc

MVC 模式简介 MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为三个核心组件:模型(Model)处理数据和业务逻辑,视图(View)负责展示数据,控制器(Con…