JavaScript 对象管家 Proxy

JavaScript 对象管家 Proxy 的完整攻略

Proxy 概述

ProxyES6 所引入的一个内置对象,它用于通过一个代理来控制对另一个对象(目标对象)的访问。被代理的对象可以是任意一个对象。通过定义一系列的 trap 方法,可以在代理对象访问目标对象时截获操作并进行相应处理。

Proxy 的基本使用

在代码中使用 Proxy 时,首先需要创建一个代理对象,同时指定要代理的目标对象。传入代理对象的第一个参数是被代理的对象,第二个参数是包含了一组捕获器 trap 的对象。

let proxyObj = new Proxy(targetObj, handlersObj);

其中,handlersObj 对象包含一系列的 trap 捕获器。一旦在代理对象上调用了某个方法或访问某个属性时,将会触发相应的对应 trap

Proxy 的常见 trap 方法

Proxy 中定义了众多的捕获器方法,其中一些常见的 trap 方法如下:

  • get(target, property, receiver):用于获取属性值时被触发。
  • set(target, property, value, receiver):用于设置属性值时被触发。
  • apply(target, thisArg, argArray):用于对代理函数的执行进行拦截和操作。
  • has(target, property):判断某个属性是否存在的方法。
  • deleteProperty(target, property):用于删除某个属性时被触发。
  • defineProperty(target, property, descriptor):用于在目标对象上定义新属性或者修改(或删除)现有属性。

示例说明一:属性名验证

以下示例展示了如何用 Proxy 实现属性名验证功能,如果属性名以 "_" 开头,则代理对象会忽略掉这个属性。

let person = {
  name: "张三",
  age: 18,
  _sayHello: function() {
    console.log("你好!");
  }
};

let validator = {
  get(target, prop) {
    if (prop.startsWith('_')) {
      throw new Error(`属性名不合法:${prop},不能以"_"开头`);
    }
    return target[prop];
  },
  set(target, key, value) {
    if (key.startsWith('_')) {
      throw new Error(`属性名不合法:${key},不能以"_"开头`);
    }
    target[key] = value;
    return true;
  }
};

let personProxy = new Proxy(person, validator);

console.log(personProxy.name); // 输出:张三
console.log(personProxy.age); // 输出:18
console.log(personProxy._sayHello()); // 报错:属性名不合法:_sayHello,不能以"_"开头

示例说明二:计算属性

以下示例展示了如何利用 Proxy 拦截一个对象多个属性的访问请求,从而生成一个共同的计算属性 _sum,此计算属性就是除了 _sum 以外其他所有属性的求和。

let numberList = {
  a: 1,
  b: 2,
  c: 3,
  d: 4
};

let sumProxy = new Proxy(numberList, {
  get(target, property) {
    if(property === '_sum') {
      return Object.values(target).reduce((a, b) => a + b, 0);
    }
    return Reflect.get(target, property);
  }
});

console.log(sumProxy.a); // 输出:1
console.log(sumProxy.b); // 输出:2
console.log(sumProxy.c); // 输出:3
console.log(sumProxy.d); // 输出:4
console.log(sumProxy._sum); // 输出:10

参考资料

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 对象管家 Proxy - Python技术站

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

相关文章

  • JavaScript中arguments和this对象用法分析

    下面我来详细讲解一下“JavaScript中arguments和this对象用法分析”的完整攻略。 一、arguments对象 1.1 什么是arguments对象 在 JavaScript 中,每个函数都有一个特殊对象 arguments,该对象包含传递给函数的参数列表。在函数体内部,可以通过 arguments 对象来访问这些参数。arguments 对…

    JavaScript 2023年5月28日
    00
  • 前端面试必会网络跨域问题解决方法

    下面我将详细讲解前端面试必会网络跨域问题解决方法的完整攻略。 说明 在开发中,如果需要从当前页面向其它域名的页面发送请求,那么可能会出现跨域的问题。跨域问题是前端开发中比较常见的问题之一。本篇文章将从以下几个方面详细讲解如何解决跨域问题: 什么是跨域问题 跨域的解决方法 JSONP跨域 CORS跨域 什么是跨域问题 跨域问题是指浏览器的同源策略限制了向不同源…

    JavaScript 2023年6月11日
    00
  • JS判断两个时间大小的示例代码

    JS判断两个时间大小是一个比较常用的功能,常用于比较两个时间先后顺序,以便进行时间排序、时间筛选等操作。下面是我为大家提供的几个示例代码及攻略。 示例一:使用Date对象实现时间比较 首先,我们需要知道JS中的Date对象是一个非常方便的时间操作工具,它可以将日期和时间存储为一个数字值,然后可以方便地进行各种处理和比较。 以下是使用Date对象实现判断两个时…

    JavaScript 2023年5月27日
    00
  • ES6新特性六:promise对象实例详解

    ES6新特性六:promise对象实例详解 Promise对象是ES6新增的一种异步编程解决方案,它解决了异步编程中回调函数嵌套过深、错误处理繁琐等问题。本文将详细介绍Promise对象的创建、状态、方法及使用。 Promise对象的创建 Promise对象是通过new关键字和Promise构造函数创建的,它接受一个函数作为参数,该函数有两个形参resolv…

    JavaScript 2023年6月11日
    00
  • jQuery表单验证之密码确认

    本文将为您提供简明易懂的jQuery表单验证之密码确认攻略。我们将提供完整的步骤和示例说明,帮助您解决表单验证过程中的疑难问题。 步骤一:引入jQuery库和验证插件 首先,您需要引入jQuery库和验证插件,以便您可以轻松地在网站上进行表单验证。您可以在以下位置找到jQuery库和验证插件: <script src="https://cod…

    JavaScript 2023年6月10日
    00
  • JavaScript判断DOM何时加载完毕的技巧

    JavaScript是一门运行在客户端的编程语言,它可以操作和控制网页中的元素和内容。但有些时候,我们需要确保DOM加载完毕后再执行JavaScript代码,因为如果在DOM加载之前执行JavaScript代码,可能会出现错误。 以下是判断DOM何时加载完毕的几种技巧: 1. window.onload window.onload是最常用的判断DOM是否加载…

    JavaScript 2023年6月10日
    00
  • JavaScript对象属性检查、增加、删除、访问操作实例

    JavaScript对象属性检查、增加、删除、访问操作实例 在JavaScript中,对象是一组无序的相关属性的集合,可以使用对象属性来存储和访问数据。在使用JavaScript对象时,我们常常需要进行属性检查、增加、删除和访问操作。下面是详细的攻略。 1. 属性检查 属性检查可以用于判断某个对象是否包含某个属性,在JavaScript中有两种方式进行属性检…

    JavaScript 2023年5月27日
    00
  • js实现统计字符串中特定字符出现个数的方法

    要实现统计字符串中特定字符出现次数的方法,可以采用循环遍历每个字符,然后用条件判断来判断该字符是否为目标字符,进而计数的方式来实现。 以下是实现该方法的完整攻略: 步骤1:定义一个函数 首先需要创建一个函数来统计字符串中特定字符出现的次数。下面的代码演示了如何定义名为“countChar”的函数,并将一个字符串和目标字符作为参数传递给它。 function …

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