当前位置:首页 > JavaScript

js代理实现

2026-04-06 11:57:27JavaScript

代理模式的概念

代理模式是一种设计模式,用于控制对对象的访问。通过代理对象,可以在目标对象的基础上增加额外功能(如拦截、验证、日志等),而无需直接修改目标对象。

js代理实现

实现代理的几种方式

使用 Proxy 对象

ES6 引入了 Proxy 对象,可以直接创建代理:

js代理实现

const target = { name: "Alice" };
const handler = {
    get: function(obj, prop) {
        console.log(`访问属性: ${prop}`);
        return obj[prop];
    },
    set: function(obj, prop, value) {
        console.log(`设置属性: ${prop} 为 ${value}`);
        obj[prop] = value;
        return true;
    }
};
const proxy = new Proxy(target, handler);
console.log(proxy.name); // 输出: "访问属性: name" -> "Alice"
proxy.age = 25; // 输出: "设置属性: age 为 25"

使用 Object.defineProperty

适用于旧版浏览器或需要兼容性的场景:

const obj = { name: "Bob" };
Object.defineProperty(obj, "name", {
    get: function() {
        console.log("获取 name 属性");
        return this._name;
    },
    set: function(value) {
        console.log("设置 name 属性为", value);
        this._name = value;
    }
});
obj.name = "Charlie"; // 输出: "设置 name 属性为 Charlie"
console.log(obj.name); // 输出: "获取 name 属性" -> "Charlie"

函数代理

对函数调用进行拦截:

function original() { console.log("原始函数"); }
const handler = {
    apply: function(target, thisArg, args) {
        console.log("函数调用被拦截");
        return target.apply(thisArg, args);
    }
};
const proxyFunc = new Proxy(original, handler);
proxyFunc(); // 输出: "函数调用被拦截" -> "原始函数"

常见应用场景

  • 数据校验:在 set 拦截器中验证赋值合法性。
  • 日志记录:在访问属性或调用方法时记录日志。
  • 缓存:通过代理实现惰性加载或缓存结果。

注意事项

  • Proxy 是 ES6 特性,需确保目标环境支持。
  • 性能敏感场景需谨慎使用代理,因其会引入额外开销。

标签: js
分享给朋友:

相关文章

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…

js实现图片移动

js实现图片移动

使用CSS和JavaScript实现图片移动 方法一:使用CSS动画结合JavaScript控制 通过CSS定义动画关键帧,JavaScript动态添加或移除动画类。 /* CSS部分 */ .m…

实现图片旋转js

实现图片旋转js

使用CSS transform属性旋转图片 通过CSS的transform属性可以轻松实现图片旋转。以下是一个简单的示例代码: const image = document.getElement…