当前位置:首页 > 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实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含inpu…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

js实现排序

js实现排序

数组排序方法 JavaScript提供了内置的sort()方法用于数组排序。默认情况下,sort()将元素转换为字符串并按照Unicode码点排序。对于数字排序,需传入比较函数。 const num…

js实现图片滚动

js实现图片滚动

图片滚动的实现方法 使用CSS动画实现 通过CSS的animation和@keyframes可以实现简单的图片滚动效果。这种方法适合静态图片的无缝循环滚动。 <style> .scr…

js实现刷新

js实现刷新

刷新当前页面 使用 location.reload() 方法可以强制刷新当前页面。该方法接受一个布尔参数,默认为 false,表示从缓存中加载页面;设为 true 时强制从服务器重新加载。 // 从…

vue.js 实现什么

vue.js 实现什么

Vue.js 的核心功能与应用场景 Vue.js 是一个渐进式 JavaScript 框架,主要用于构建用户界面(UI)和单页应用(SPA)。其核心设计理念是轻量、易用和灵活,适合从简单交互到复杂企业…