ES6之Proxy的使用详解

 更新时间:2025年01月15日 11:35:25   作者:Cshaosun  
Proxy是ES6新增的内置对象,用于拦截并自定义对象的各种操作,通过定义拦截器,可以实现数据校验和保护、日志记录、数据绑定和观察等功能

什么是Proxy

JavaScript 中的 Proxy 是 ES6 中新增的对象,

Proxy是JavaScript中的内置对象,它提供了一种机制,可以拦截并自定义各种操作,如属性访问、函数调用、构造函数调用等。

Proxy构造函数接受两个参数目标对象(被代理的对象)和一个处理器对象(用于定义拦截器)。

// 写法:target是目标对象,handler是处理器对象
const proxy = new Proxy(target, handler);

Proxy的拦截器【处理器对象】(handler)

拦截器是一个包含各种拦截方法的对象,用于定义在代理对象上执行的操作。

常用的拦截方法包括:getsetapplyconstructdeletePropertyhasgetOwnPropertyDescriptor等。【这些拦截方法会在代理对象进行对应操作时自动触发】

  • get(target, property, receiver):拦截对目标对象属性的读取操作
  • set(target, property, value, receiver):拦截对目标对象属性的赋值操作。
  • apply(target, thisArg, argumentsList):拦截对目标对象的函数调用。
  • construct(target, argumentsList, newTarget):拦截对目标对象的构造函数调用。

Proxy的应用场景

数据校验和保护

在属性访问和赋值操作中校验数据的合法性。

// 定义待验证的对象
const user = {
  name: '',
  age: 0
};

// 创建代理对象
const userProxy = new Proxy(user, {
  set(target, property, value) {
    // 进行数据合法性验证
    if (property === 'name') {
      if (typeof value !== 'string' || value === '') {
        throw new Error('姓名必须是非空字符串');
      }
    } else if (property === 'age') {
      if (typeof value !== 'number' || value < 0 || !Number.isInteger(value)) {
        throw new Error('年龄必须是非负整数');
      }
    }

    // 合法性验证通过,设置属性值
    target[property] = value;
    return true;
  }
});

// 使用代理对象进行属性访问和赋值
userProxy.name = 'John';
console.log(userProxy.name); // 输出: "John"

userProxy.age = 25;
console.log(userProxy.age); // 输出: 25

// 非法赋值会触发异常
try {
  userProxy.name = '';
} catch (error) {
  console.log(error.message); // 输出: "姓名必须是非空字符串"
}

try {
  userProxy.age = '30';
} catch (error) {
  console.log(error.message); // 输出: "年龄必须是非负整数"
}

日志记录

拦截对对象的操作以记录日志。

// 定义待记录日志的对象
const person = {
  name: 'John',
  age: 30
};

// 创建代理对象
const personProxy = new Proxy(person, {
  get(target, property) {
    // 记录属性访问日志
    console.log(`访问属性: ${property}`);
    
    // 返回属性值
    return target[property];
  },
  set(target, property, value) {
    // 记录属性赋值日志
    console.log(`设置属性: ${property},值: ${value}`);

    // 设置属性值
    target[property] = value;
    return true;
  },
  deleteProperty(target, property) {
    // 记录属性删除日志
    console.log(`删除属性: ${property}`);

    // 删除属性
    delete target[property];
    return true;
  }
});

// 使用代理对象进行属性访问、赋值和删除
console.log(personProxy.name); // 输出:访问属性: name -> "John"

personProxy.age = 35; // 输出:设置属性: age,值: 35
console.log(personProxy.age); // 输出:访问属性: age -> 35

delete personProxy.age; // 输出:删除属性: age
console.log(personProxy.age); // 输出:访问属性: age -> undefined

数据绑定和观察

通过拦截器实现数据绑定和观察模式。

// 创建数据对象
const data = {
  name: 'John',
  age: 30
};

// 创建观察者对象,用于监听数据变化
const observer = {
  notify(target, property) {
    console.log(`属性 ${property} 发生变化,新值为: ${target[property]}`);
  }
};

// 创建代理对象
const dataProxy = new Proxy(data, {
  set(target, property, value) {
    // 设置属性值
    target[property] = value;

    // 通知观察者属性变化
    observer.notify(target, property);

    return true;
  }
});

// 修改代理对象的属性值
dataProxy.name = 'Alice'; // 输出:属性 name 发生变化,新值为: Alice
dataProxy.age = 35; // 输出:属性 age 发生变化,新值为: 35

通过使用Proxy对象,我们可以轻松地通过拦截器实现数据绑定和观察模式。

在修改数据时,我们可以自动通知观察者,并做出相应的响应。这样可以实现数据与界面的自动同步、实时更新等功能。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 谈一谈javascript闭包

    谈一谈javascript闭包

    这篇文章主要介绍了javascript闭包,闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • js正则表达式中test,exec,match方法的区别说明

    js正则表达式中test,exec,match方法的区别说明

    本篇文章主要是对js正则表达式中test,exec,match方法的区别进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • 使用javascript实现Iframe自适应高度

    使用javascript实现Iframe自适应高度

    这篇文章主要介绍了使用javascript实现Iframe自适应高度,需要的朋友可以参考下
    2014-12-12
  • ECMAScript6函数默认参数

    ECMAScript6函数默认参数

    这篇文章主要介绍了ECMAScript6函数默认参数的相关资料,需要的朋友可以参考下
    2015-06-06
  • webpack多入口多出口的实现方法

    webpack多入口多出口的实现方法

    这篇文章主要介绍了webpack多入口多出口的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 利用webpack理解CommonJS和ES Modules的差异区别

    利用webpack理解CommonJS和ES Modules的差异区别

    这篇文章主要介绍了利用webpack理解CommonJS和ES Modules的差异区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • js简单抽奖代码

    js简单抽奖代码

    年底了各个公司都有抽奖活动,我也写了一个超级简单的代码来实现抽奖效果,这里没有华丽的Css3效果,但却有短小精悍的js代码。
    2015-01-01
  • JavaScript对JSON数组简单排序操作示例

    JavaScript对JSON数组简单排序操作示例

    这篇文章主要介绍了JavaScript对JSON数组简单排序操作,结合实例形式分析了javascript使用sort()方法针对json数组元素排序的相关操作技巧与注意事项,需要的朋友可以参考下
    2019-01-01
  • 使用原生JS实现火锅点餐小程序(面向对象思想)

    使用原生JS实现火锅点餐小程序(面向对象思想)

    这篇文章主要介绍了使用原生JS实现火锅点餐小程序(面向对象思想),在这里小程序使用的是es6开发标准,本文通过代码展示,截图的形式给大家介绍,需要的朋友可以参考下
    2019-12-12
  • 10 种最常见的 Javascript 错误(频率最高)

    10 种最常见的 Javascript 错误(频率最高)

    本文是小编给大家收藏的JavaScript 中频度最高的 10 种错误,我们会告诉你什么原因导致了这些错误,以及如何防止这些错误发生。需要的朋友参考下
    2018-02-02

最新评论