JavaScript的Proxy可以做哪些有意思的事儿

yizhihongxing

下面是详细讲解 JavaScript 的 Proxy 可以做哪些有意思的事儿的完整攻略:

什么是JavaScript Proxy

Proxy 是 ES6 中的一个新特性,用于在对象之前设立一个“拦截器”,对该对象的访问进行过滤和改写,提供了一种机制来对对象的访问进行监视和控制。

Proxy 最常见的用途之一是在对象上设置隐藏属性或包装器,它可以通过重写 getter/setter 和增加钩子函数,来控制对象属性的的访问方式。在这个过程中,代理对于对象的真实访问是透明的。

Proxy 能做什么

1. 数据验证

可以利用 Proxy 对数据进行验证,比如使用 Proxy 拦截对象的 set 和 get 方法,来检测对象属性值的合法性。下面是一个示例代码:

const handler = {
  set(target, property, value) {
    if (property === 'age') {
      if (!Number.isInteger(value)) {
        throw new TypeError('The age is not an integer');
      }
      if (value > 150 || value < 0) {
        throw new RangeError('The age is invalid');
      }
    }
    target[property] = value;
    return true;
  }
};

const person = new Proxy({}, handler);
person.name = 'Jack';
person.age = 30;
console.log(person); // { name: "Jack", age: 30 }
person.age = 170;  // throw new RangeError('The age is invalid');
person.age = 'fourty'; // throw new TypeError('The age is not an integer');

上面的代码中,当设置 person 对象中的 age 属性值时,会首先进入 handler 的 set 方法,在 set 方法中检测 age 属性值是否符合条件,如果不符合条件就抛出错误,如果符合条件就将 age 属性值赋值给对象,在这个过程中代理对于对象的访问是透明的。

2. 属性代理

使用 Proxy 代理对象的时候,可以对属性进行代理,进行操作。下面是一个示例代码:

let obj = {
    name: 'Tom',
    age: 18
};

// 将源对象 obj 代理到代理对象 proxy 上
let proxy = new Proxy(obj, {
    get(target, key) {
        console.log('通过代理获取属性值:' + key);
        return target[key];
    },

    set(target, key, value) {
        console.log(`通过代理设置属性值:${key}=${value}`);
        target[key] = value;
        return true;
    }
});

console.log(proxy.name); // 通过代理获取属性值:name, Tom
proxy.age = 20; // 通过代理设置属性值:age=20
console.log(obj.age); // 20

上面的代码中,通过使用 Proxy 对象代理 obj,就可以在获取属性值的时候,自定义一个操作,这个操作会在获取属性值的时候自动执行。同样的,对于属性值的修改,可以在代理的 set 方法中添加操作,来代理操作。

常用钩子函数

下面是 Proxy 中常用的钩子函数和作用:

  • get(target, key, receiver):拦截对象属性的读取,代理获取对象属性值时触发。
  • set(target, key, value, receiver):拦截对象属性的修改,代理对象属性值设置时触发。
  • has(target, key):拦截 for in 循环和 in 操作符时的行为。
  • defineProperty(target, key, propertyDescriptor):代理Object.defineProperty()操作。
  • deleteProperty(target, key):拦截对象属性的删除操作。
  • ownKeys(target):拦截 Object.getOwnPropertyNames()、Object.getOwnPropertySymbols()、Object.keys()以及 for...in循环中的收集封装对象自己的键。
  • apply(target, thisArg, argumentsList):拦截函数的调用、call 和 apply 操作。
  • construct(target, argumentsList, newTarget):拦截 new 操作符,用于为一个对象实例化时执行一些操作。

总结

通过上面对于 Proxy 对象的介绍,我们可以发现 Proxy 用处还是蛮丰富的,可以用于数据验证、属性代理等多个方面,这样可以让我们的程序更加健壮,更加方便我们对数据进行操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript的Proxy可以做哪些有意思的事儿 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript webpack5配置及使用基本介绍

    下面我来详细讲解一下“JavaScript webpack5配置及使用基本介绍”的攻略。 1. 简介 Webpack是一个打包工具,它通过分析模块之间的依赖关系,将多个模块打包成一个或多个bundle文件,常用于前端项目的构建过程中。Webpack5是Webpack的最新版本,新增了很多功能和优化。 2. 安装和基本使用 先来安装Webpack和Webpac…

    JavaScript 2023年5月27日
    00
  • 以JSON形式将JS中Array对象数组传至后台的方法

    将JavaScript中的Array对象数组以JSON格式传递至后台的基本步骤包括以下几点: 创建一个Array对象数组 使用JSON.stringify()将Array对象数组转换为JSON格式字符串 使用XMLHttpRequest对象将JSON格式字符串发送到后台 在后台解析JSON字符串并从中提取需要的数据 以下是一个简单的示例代码,演示如何将JS中…

    JavaScript 2023年5月27日
    00
  • 详解JavaScript ES6中的模板字符串

    详解JavaScript ES6中的模板字符串 ES6(ECMAScript 2015)引入了许多新功能,其中一个功能是模板字符串。模板字符串是可以包括变量和表达式的字符串字面量,它可以方便地构建动态字符串,比传统的字符串连接方式更加简单和易读。在本篇文章中,我们将深入探讨什么是模板字符串,以及如何在JavaScript中使用它。 基本语法 模板字符串用反引…

    JavaScript 2023年5月28日
    00
  • JavaScript的数据类型转换原则(干货)

    JavaScript的数据类型转换原则(干货) 1. 数据类型转换的基本原则 在JavaScript中,我们经常需要将不同类型的数据进行转换,特别是在进行运算、比较和赋值等操作的时候。因此,了解数据类型转换的基本原则对于编写高质量的JavaScript代码是非常重要的。 1.1. 隐式类型转换 JavaScript中有两种类型转换方式:显式类型转换和隐式类型…

    JavaScript 2023年5月28日
    00
  • Javascript中正则表达式的使用及基本语法

    下面是Javascript中正则表达式的使用及基本语法的完整攻略。 一、什么是正则表达式 正则表达式,也称为正规表示式、regex或regexp,是用于匹配字符串中模式的一种表达式。正则表达式在大多数编程语言中都是支持的,它允许我们快速地检索和替换文本。 二、正则表达式的语法 Javascript中使用正则表达式时,需要通过RegExp对象来创建和使用。其基…

    JavaScript 2023年5月19日
    00
  • JS中call/apply、arguments、undefined/null方法详解

    JS中call/apply、arguments、undefined/null方法详解 本文将详细讲解JavaScript中的call、apply、arguments、undefined和null这几个常用的方法,希望能帮助读者更好地理解它们的用法和意义。 call和apply的用法 call和apply的作用是改变函数的执行上下文,也就是函数中this的指向…

    JavaScript 2023年6月10日
    00
  • IE8 原生JSON支持

    IE8 原生 JSON 支持是指 Internet Explorer 8(IE8)浏览器中自带了对 JSON 数据格式的支持。在 IE8 之前的版本中,如果要使用 JSON 格式的数据,需要引入第三方库来解析或者手写解析函数。而在 IE8 中,开发者可以直接使用浏览器提供的全局对象 JSON 来解析和序列化 JSON 格式的数据,无需引入其他库。 为了使用 …

    JavaScript 2023年5月27日
    00
  • Javascript Math SQRT1_2 属性

    JavaScript中的Math.SQRT1_2属性是一个常数,表示1/2的平方根。以下是关于Math.SQRT1_2属性的完整攻略,包含两个示例。 JavaScript Math对象的SQRT1_2属性 JavaScript的SQRT1_2属性是一个常数,表示1/2的平方根。下面是SQRT1_2属性的语法: Math.SQRT1_2 下面是一个SQRT1_…

    JavaScript 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部