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日

相关文章

  • JS中2种定时器的使用及清除的实现

    JS中有两种定时器,分别是setInterval()和setTimeout(),这两种定时器都有其特殊的用处。下面我将为你详细讲解这两种定时器的使用方法和如何清除定时器。 setInterval()定时器 setInterval() 根据指定的周期(以毫秒为单位)来调度一个函数,函数会按照指定的周期被周期性地执行。setInterval函数接受两个参数——第…

    JavaScript 2023年6月11日
    00
  • JS数组扁平化、去重、排序操作实例详解

    JS数组扁平化、去重、排序操作实例详解 在JS编程中,经常需要对数组进行处理,比如将一个多维数组“扁平化”成一维数组、去掉数组中的重复元素、按照一定规则排序等操作。本文将介绍如何在JS中实现数组的扁平化、去重和排序操作,并给出相应的代码示例。 JS数组扁平化 所谓的数组扁平化,就是将一个嵌套多层的数组变成一个一维数组。比如: const arr = [1, …

    JavaScript 2023年5月27日
    00
  • js 执行上下文和作用域的相关总结

    JS执行上下文和作用域相关总结 在JavaScript中,代码执行的上下文和作用域是非常重要的概念。正确理解和应用它们可以帮助我们更好地编写和调试JavaScript代码。下面是一个总结: 执行上下文 执行上下文是JavaScript代码执行的环境,其中包括当前执行的代码、变量和对象等,JS 中有三种不同类型的执行上下文:全局上下文,函数上下文,eval上下…

    JavaScript 2023年6月10日
    00
  • element实现合并单元格通用方法

    当需要将某些单元格合并为一个单元格时,我们可以使用colspan和rowspan属性进行处理。但这些属性只适用于表格的较小区域。如果我们需要在整个表格中合并单元格,这时候就可以使用JavaScript来实现。element库提供一个通用方法来实现合并单元格。下面是具体步骤: 获取表格元素 首先,需要获取到需要合并单元格的表格元素。这可以通过元素的ID来获取,…

    JavaScript 2023年6月10日
    00
  • JavaScript属性操作

    JavaScript属性操作 在JavaScript中,我们可以使用属性来表示对象的特征及状态。属性操作是常见的JavaScript编程任务,涉及到访问、设置、删除属性等任务。本文将介绍JavaScript属性操作的基本知识以及几个例子。 访问属性 我们可以使用点号或方括号来访问JavaScript对象的属性。点号方式是JavaScript语法中更常用的一种…

    JavaScript 2023年5月18日
    00
  • JavaScript实现同时调用多个函数的方法

    为了实现同时调用多个函数,有两种方法可以选择:串行和并行。串行指的是按照指定的顺序依次执行函数,而并行指的是同时执行所有函数,不关心它们的顺序。 串行调用函数的方法 方法一:Promise 利用 ES6 的 Promise 实现,可以方便地实现多个函数的串行调用。 Promise 对象的主要作用是为处理异步操作提供一个统一的接口,其中包含三个状态:进行中(p…

    JavaScript 2023年5月27日
    00
  • 纯JavaScript代码实现文本比较工具

    下面我将详细阐述“纯JavaScript代码实现文本比较工具”的完整攻略。主要包括以下几个步骤: 1. 获取文本内容 在代码中定义两个文本框,分别用于输入需要比较的文本内容。然后通过JavaScript代码获取文本框中的内容,并将其存储为字符串。 var text1 = document.getElementById("text1").v…

    JavaScript 2023年5月27日
    00
  • js中数组Array的一些常用方法总结

    接下来我将详细讲解“js中数组Array的一些常用方法总结”,内容分为以下部分: 概述 数组的创建和赋值 数组的常用方法 1. 概述 数组是 JavaScript 中最常用的数据类型之一,它可以容纳多个值,并按照一定的顺序进行存储和访问。在 JavaScript 中,数组是动态的,即在创建数组时不需要指定其大小,而可以根据需要动态添加或删除元素。 2. 数组…

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