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 时间戳与时间日期间相互转换”的完整攻略。 什么是时间戳? 时间戳是用于表示时间的一种方式,它是自1970年1月1日 00:00:00 UTC到当前时间的毫秒数。JavaScript只支持精确到毫秒级别的时间戳。 时间戳的好处是可以通过它来进行时间比较或计算时间差等操作,并且可以通过时间戳在不同的设备和系统之间进行时间的…

    JavaScript 2023年5月27日
    00
  • JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)

    获取鼠标移动时的坐标是前端开发中常用的操作。随着浏览器的不断升级和发展,现在的浏览器大多都能支持 mousemove 事件和相应的 clientX、clientY 属性来获取鼠标的坐标。不过对于兼容老版本IE(IE8及以下)的浏览器,我们需要使用其他的方式来获取鼠标坐标。 以下是 JavaScript 获取鼠标移动时的坐标的完整攻略: 1. 监听mousem…

    JavaScript 2023年6月11日
    00
  • 浅谈JS读取DOM对象(标签)的自定义属性

    一、什么是DOM对象自定义属性 在HTML标签中,我们可以自定义属性,比如:<div data-id=”123″>自定义属性</div>,这里的data-id即为自定义属性。 在JavaScript中,我们可以通过DOM对象的dataset属性来读取自定义属性的值。 二、JS读取DOM对象(标签)的自定义属性 1.读取单个DOM对象的…

    JavaScript 2023年6月10日
    00
  • JavaScript获取一个范围内日期的方法

    获取一个范围内日期的方法在JavaScript中有多种实现方式。我将一一介绍它们的实现方法和步骤。 方法一:利用Date对象的setDate()和getDate()方法 这种方法可以获取指定开始日期和结束日期之间的所有日期,只需要一个循环即可完成。 步骤 将开始日期和结束日期转换为Date对象。 const startDate = new Date(‘202…

    JavaScript 2023年5月27日
    00
  • javascript从右边截取指定字符串的三种实现方法

    如下是关于”javascript从右边截取指定字符串的三种实现方法”的攻略解释。 概述 当我们在实际的 Javascript 开发过程中处理一个字符串的时候,会经常遇到需要从字符串的右边开始截取指定长度的字符的需求。下面将会介绍三种实现 “javascript从右边截取指定字符串” 的方法。 方法一:使用String对象的slice()方法 slice()方…

    JavaScript 2023年5月28日
    00
  • JavaScript中时间格式化新思路toLocaleString()

    JavaScript中日期时间格式化是Web开发中非常重要的一部分,有效的日期时间格式化可以使得代码更加易读、易懂。同时,格式化后的日期时间字符串也可以满足一些需求,如显示本地格式化的时间、显示不同时区的时间、自定义时间格式等。 在JavaScript中,可以使用toLocaleString()方法来格式化日期时间。该方法返回本地时间的格式字符串,可以轻松地…

    JavaScript 2023年5月27日
    00
  • JavaScript自定义数组排序方法

    接下来我会详细讲解如何使用 JavaScript 自定义数组排序方法。 步骤一:了解数组排序方法 在 JavaScript 中,Array 对象自带 sort() 方法,可以对数组进行排序。默认情况下,sort() 方法将按照字符串的 Unicode 位点值进行排序。但是,如果数组中存储的是数字、日期或其他对象,那么这个排序方式可能并不适用。此时,我们可以使…

    JavaScript 2023年5月27日
    00
  • JavaScript进阶练习及简单实例分析

    下面是“JavaScript进阶练习及简单实例分析”的完整攻略。 JavaScript进阶练习 递归 递归是指函数调用自身的一种行为。在JavaScript中,递归经常用来解决一些复杂问题,比如搜索和排序等。 示例1:计算阶乘 以下代码演示了如何使用递归计算阶乘: function factorial(n) { if (n === 0) { return 1…

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