当前位置:首页 > JavaScript

纯js实现代理

2026-03-01 15:49:56JavaScript

纯JavaScript实现代理

在JavaScript中,可以通过Proxy对象实现代理模式。Proxy用于定义基本操作的自定义行为(如属性查找、赋值、枚举等)。

基本语法

创建一个Proxy需要两个参数:

纯js实现代理

  • target:要代理的目标对象。
  • handler:定义代理行为的对象,包含捕获器(traps)的方法。
const proxy = new Proxy(target, handler);

常用捕获器

  • get(target, prop, receiver):拦截属性读取操作。
  • set(target, prop, value, receiver):拦截属性设置操作。
  • has(target, prop):拦截in操作符。
  • deleteProperty(target, prop):拦截delete操作。
  • apply(target, thisArg, args):拦截函数调用。

示例代码

1. 拦截属性访问
const target = { name: "Alice", age: 25 };
const handler = {
    get(target, prop) {
        if (prop in target) {
            return target[prop];
        }
        return `Property "${prop}" does not exist`;
    }
};
const proxy = new Proxy(target, handler);

console.log(proxy.name); // "Alice"
console.log(proxy.hobby); // "Property "hobby" does not exist"
2. 拦截属性赋值
const validator = {
    set(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);

person.age = 25; // 成功
person.age = "25"; // 抛出错误: Age must be a number
3. 拦截函数调用
const targetFunc = (a, b) => a + b;
const handler = {
    apply(target, thisArg, args) {
        console.log(`Function called with args: ${args}`);
        return target(...args) * 2;
    }
};
const proxyFunc = new Proxy(targetFunc, handler);

console.log(proxyFunc(2, 3)); // 输出: Function called with args: 2,3 → 10

实际应用场景

  • 数据验证:拦截属性赋值并验证数据合法性。
  • 日志记录:跟踪对象属性的访问或修改。
  • 缓存:拦截函数调用,实现缓存逻辑。
  • 惰性加载:延迟加载对象属性或资源。

注意事项

  • Proxy是透明的,对目标对象的操作会直接影响代理对象。
  • 捕获器方法必须返回正确的值(如set需返回布尔值)。
  • 不支持对原始值(如字符串、数字)的直接代理,需包装为对象。

标签: js
分享给朋友:

相关文章

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现百叶窗

js实现百叶窗

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

链表实现js

链表实现js

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