JavaScript 对象管家 Proxy

yizhihongxing

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面向对象之定义成员方法实例分析

    JavaScript面向对象之定义成员方法实例分析 在JavaScript中,可以使用面向对象的思想来编写代码,其中定义成员方法是非常常见的操作。本文将详细讲解如何定义成员方法以及如何使用。 什么是成员方法 成员方法是一种在类或对象中定义的函数。它们可以访问类或对象的数据和其他方法,并能够执行特定的操作。 如何定义成员方法 在JavaScript中,可以通过…

    JavaScript 2023年5月27日
    00
  • jQuery Validate表单验证插件 添加class属性形式的校验

    步骤 首先在HTML页面中引入jQuery和jQuery Validate插件的js文件。 <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdn.boot…

    JavaScript 2023年6月10日
    00
  • Move.js入门

    Move.js入门攻略 什么是Move.js Move.js是一个轻量级的JavaScript动画库,用于实现Web页面中的动画效果。它支持常用的CSS动画属性以及自定义路径和缓动效果,同时具有跨浏览器兼容性和高性能特点。 安装Move.js 可以通过以下两种方式来安装Move.js: 从官方网站下载move.min.js文件并引入到HTML文件中: &lt…

    JavaScript 2023年6月10日
    00
  • 浅谈TypeScript3.7中值得注意的3个新特性

    首先,让我们先简单介绍一下TypeScript。TypeScript是微软开发的一种超集编程语言,它是JavaScript的扩展,可以增加静态类型、接口、类、命名空间等特性,将JavaScript打造成强类型的脚本语言。 TypeScript3.7是最新的版本,其中有三个新特性值得我们关注。 1.声明只读数组和元组 在TypeScript 3.7中,我们可以…

    JavaScript 2023年5月27日
    00
  • JavaScript中调用函数的4种方式代码实例

    让我来详细讲解一下“JavaScript中调用函数的4种方式代码实例”。 1. 直接调用函数 直接调用函数指的是使用函数名,后跟一对圆括号,不带任何修饰符或执行环境调用函数。 示例: function sayHello() { console.log("Hello!"); } sayHello(); 上述示例中我们定义了一个函数 sayH…

    JavaScript 2023年5月27日
    00
  • js以对象为索引的关联数组

    “以对象为索引的关联数组”在JavaScript中被称为“对象”,也是一种常见的数据结构。从表面上看,它与其他编程语言中的字典或散列表/哈希表类似,但实际上更加灵活和强大。 基本概念 JavaScript中的对象是一组键/值对,其中键是字符串(或符号)类型,而值可以是任何数据类型(包括另一个对象)。对象中的键是唯一的,且不允许重复,但同一个对象的多个键可以指…

    JavaScript 2023年6月10日
    00
  • JS开发常用工具函数(小结)

    JS开发常用工具函数(小结)攻略 为什么需要工具函数? 在JavaScript开发中,我们经常需要针对某一些操作、方法,编写一些公共函数,以便在需要的时候能够直接调用。而这些工具函数,会在项目中使用到很多地方,提高了代码可读性和代码复用性。 JS开发常用工具函数 下面是一些JS开发常用的工具函数,包括: 1. 判断是否为对象 有时候需要判断一个变量是不是对象…

    JavaScript 2023年5月27日
    00
  • AngularJS使用ngMessages进行表单验证

    好的!那么在这里我将详细为您讲解如何使用AngularJS中的ngMessages模块进行表单验证。 什么是ngMessages? ngMessages是AngularJS模块中的一种指令,用于在UI层面进行表单验证。ngMessages会根据验证不通过时的条件,自动输出相应的错误消息。这样可以极大地方便用户填写表单,并且提示信息是根据具体情况显示的,让用户…

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