当前位置:首页 > JavaScript

js代理实现

2026-03-14 18:08:32JavaScript

代理模式的概念

代理模式是一种设计模式,为其他对象提供一种代理以控制对这个对象的访问。在JavaScript中,代理通常用于拦截和自定义对象的基本操作。

Proxy对象的基本使用

JavaScript提供了内置的Proxy对象,可以用来创建对象的代理。Proxy构造函数接受两个参数:目标对象和处理程序对象。

const target = {};
const handler = {
  get: function(target, prop, receiver) {
    return Reflect.get(...arguments);
  }
};
const proxy = new Proxy(target, handler);

常见的代理拦截操作

代理可以拦截多种基本操作,以下是常见的几种拦截器:

get拦截器 用于拦截对象属性的读取操作。

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

set拦截器 用于拦截对象属性的设置操作。

const handler = {
  set: function(target, prop, value) {
    if (prop === 'age' && typeof value !== 'number') {
      throw new Error('Age must be a number');
    }
    target[prop] = value;
    return true;
  }
};

has拦截器 用于拦截in操作符。

const handler = {
  has: function(target, prop) {
    return prop.startsWith('_') ? false : prop in target;
  }
};

实现数据验证

代理可以用于实现数据验证,确保对象属性的值符合特定要求。

const validator = {
  set: function(obj, prop, value) {
    if (prop === 'age') {
      if (!Number.isInteger(value)) {
        throw new TypeError('Age must be an integer');
      }
      if (value < 0) {
        throw new RangeError('Age must be positive');
      }
    }
    obj[prop] = value;
    return true;
  }
};

实现私有属性

通过代理可以实现类似私有属性的功能,阻止对特定前缀属性的访问。

const privateHandler = {
  get: function(target, prop) {
    if (prop.startsWith('_')) {
      throw new Error('Cannot access private property');
    }
    return target[prop];
  },
  set: function(target, prop, value) {
    if (prop.startsWith('_')) {
      throw new Error('Cannot set private property');
    }
    target[prop] = value;
    return true;
  }
};

实现函数代理

代理不仅可以用于对象,还可以用于函数,拦截函数的调用操作。

function wrap(target) {
  return new Proxy(target, {
    apply: function(target, thisArg, argumentsList) {
      console.log('Function called with args:', argumentsList);
      return target.apply(thisArg, argumentsList);
    }
  });
}

实现缓存代理

代理可以用于实现缓存功能,避免重复计算。

js代理实现

function createCacheProxy(fn) {
  const cache = new Map();
  return new Proxy(fn, {
    apply: function(target, thisArg, args) {
      const key = args.join('-');
      if (cache.has(key)) {
        return cache.get(key);
      }
      const result = target.apply(thisArg, args);
      cache.set(key, result);
      return result;
    }
  });
}

注意事项

使用Proxy时需要注意浏览器兼容性问题,Proxy是ES6特性,不支持IE浏览器。代理的性能开销比直接操作对象要大,在性能敏感的场景需要谨慎使用。

标签: js
分享给朋友:

相关文章

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js实现隐藏div

js实现隐藏div

隐藏div的几种方法 使用JavaScript隐藏div元素可以通过多种方式实现,以下是几种常见的方法: 方法一:修改style.display属性 将div的display属性设置为"none"…