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

下面是详细讲解 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判断文件是否存在(客户端/服务器端)

    Javascript判断文件是否存在的完整攻略 在Javascript中判断文件是否存在,分为客户端和服务器端两种情况。 1. 客户端判断文件是否存在 在客户端,可以使用XMLHttpRequest对象来进行异步判断文件是否存在。这里提供一个示例: function checkFileExists(url, callback) { var xhr = new…

    JavaScript 2023年5月27日
    00
  • Javascript的比较汇总

    针对“JavaScript的比较汇总”的完整攻略,我为您准备了如下的详细讲解: JavaScript的比较汇总 简介 在JavaScript中,我们经常需要使用比较运算符来进行比较操作。本文将详细介绍JavaScript的比较汇总,包括比较运算符、非数值类型的比较、严格相等与相等运算符、三元运算符等内容。 比较运算符 JavaScript中的比较运算符分为小…

    JavaScript 2023年5月18日
    00
  • 详谈表单格式化插件jquery.serializeJSON

    下面是关于详谈表单格式化插件jquery.serializeJSON的完整攻略。 什么是jquery.serializeJSON插件? jquery.serializeJSON插件是一个可以将表单数据转换为JSON格式的jQuery插件。在提交表单时,我们经常需要将表单数据打包成JSON格式进行传输。因此,这个插件可以帮助我们快速、便捷地实现这个功能。 插件…

    JavaScript 2023年5月27日
    00
  • JS面试题中深拷贝的实现讲解

    让我来详细讲解一下“JS面试题中深拷贝的实现讲解”的完整攻略。 什么是深拷贝 深拷贝是创建一个新的对象,复制原始数据的所有属性,并且递归地复制该对象的所有属性,原始对象中的所有嵌套对象也被递归复制,即所有的嵌套对象都得到相同的值的一个全新的独立的拷贝,与原始对象没有任何联系。 深拷贝的实现 实现方式 递归拷贝 JSON.parse && JS…

    JavaScript 2023年6月10日
    00
  • 你所不了解的javascript操作DOM的细节知识点(一)

    下面就为大家详细讲解“你所不了解的JavaScript操作DOM的细节知识点(一)”的完整攻略。 什么是DOM? DOM(文档对象模型)是指一种用于在HTML、XML等文档中描述元素的层次结构的API。通过DOM,JavaScript可以获取和修改文档的内容和结构。 元素节点和文本节点 在DOM中,每一个HTML元素都被表示为一个元素节点(element n…

    JavaScript 2023年6月10日
    00
  • javascript实时显示北京时间的方法

    实时显示北京时间可以用JavaScript来实现,具体实现方法有多种,下面我将分享两种常用方法,分别是: 第一种方法:使用Date对象实现实时更新北京时间 在HTML文件中通过<script>标签引入JavaScript代码,如下: <!DOCTYPE html> <html> <head> <title…

    JavaScript 2023年5月27日
    00
  • 如何通过JS实现转码与解码

    下面是如何通过JS实现转码与解码的完整攻略: 一、什么是转码与解码? 在计算机领域,转码与解码是非常重要的概念。转码是将一种编码方式的数据转换为另一种编码方式的数据,而解码则是将编码后的数据转换为原始数据。在日常编程中,常常会用到转码与解码,比如在处理网络传输、数据存储、文本处理等方面。 二、在JS中如何进行转码与解码? 在JS中,可以通过内置的一些方法来实…

    JavaScript 2023年5月20日
    00
  • Typescript中函数类型及示例详解

    Typescript中的函数类型可以通过声明函数的参数类型、返回值类型及函数主体来限制函数的使用。在使用Typescript开发中,了解函数类型及其使用方法是非常重要的,下面介绍Typescript中函数类型的详细攻略。 一、函数类型的定义 在Typescript中,可以使用以下两种方式来定义函数类型: 1.函数声明式定义函数类型 如下例所示,我们使用声明式…

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