JavaScript的Proxy对象详解

JavaScript的Proxy对象详解

什么是Proxy对象

Proxy 是 ES6 新增的语法,它允许你在外部控制对象和函数的访问行为。可以说,Proxy 是以对象为基础的 元编程 ,使得我们可以编写出更加可复用,更加通用的 Javascript 代码。

创建一个Proxy对象

可以使用 new 操作符来创建一个 Proxy 对象,其中第一个参数为需要代理的对象,第二个参数为代理行为的定义。

示例代码如下:

let proxy = new Proxy(target, handler);

在上面的代码中,target 指的是被代理的目标对象,handler 对象定义了代理行为的具体实现。

Proxy对象的方法

Proxy 对象会为被代理对象提供一些默认的方法,它们会影响到被代理对象的访问。

  1. get(target, propKey, receiver)

    该方法会在访问属性时被调用,接收三个参数,分别是对象本身,属性 key 值,以及 Proxy 对象本身。在该方法中,可以对属性的访问进行拦截和处理。

    下面是一个简单的示例:

    ```javascript
    let target = {
    name: 'Proxy'
    };

    let handler = {
    get: function(target, propKey) {
    if (propKey in target) {
    return target[propKey];
    } else {
    return Property ${propKey} does not exist.;
    }
    }
    };

    let proxy = new Proxy(target, handler);

    console.log(proxy.name); // Proxy
    console.log(proxy.age); // Property age does not exist.
    ```

    在上面的代码中,我们定义了一个 handler 对象,并在其中定义了 get 方法来对属性的访问进行拦截。当访问的属性存在时,我们将直接返回 target[propKey]。当属性不存在时,我们返回一个错误信息。

  2. set(target, propKey, value, receiver)

    该方法会在设置属性时被调用,接收四个参数,分别是对象本身,属性 key 值,打算设置的属性值,以及 Proxy 对象本身。在该方法中,可以对属性的设置进行拦截和处理。

    下面是一个简单的示例:

    ```javascript
    let target = {
    name: 'Proxy'
    };

    let handler = {
    set: function(target, propKey, value) {
    if (propKey === 'age') {
    if (typeof value !== 'number') {
    throw new TypeError('The age must be a number.');
    }
    }
    target[propKey] = value;
    }
    };

    let proxy = new Proxy(target, handler);

    proxy.age = 18; // ok
    proxy.age = '18'; // Error: The age must be a number.
    ```

    在上面的代码中,我们定义了一个 handler 对象,并在其中定义了 set 方法来对属性的设置进行拦截。当打算设置的属性为 'age' 时,我们检查其类型是否为 number。如果不是,我们抛出一个错误信息。如果是,我们则直接将值设置到 target[propKey] 中。

示例应用

劫持一个对象所有的 get 操作

默认情况下,访问一个 JavaScript 对象中不存在的属性会返回 undefined。但是在某些情况下,我们可能需要更加优雅的方式,而不是直接返回 undefined。这就是我们可以使用 Proxy 对象的 get 方法,劫持对象所有的 get 操作。

下面是一个实现:

let target = {
    name: 'Proxy'
};

let handler = {
    get: function(target, propKey) {
        return `The value of property ${propKey} is ${target[propKey]}.`;
    }
};

let proxy = new Proxy(target, handler);

console.log(proxy.name);    // The value of property name is Proxy.
console.log(proxy.age);     // The value of property age is undefined.

代码中,我们如下修改:

  1. 重写了 handler.get 方法,将属性访问劫持,并返回一个判断。
  2. target 为基础,利用 handler 创建 proxy

通过上面示例可以看出,当我们访问 proxy 对象中不存在的属性时,它会返回一个提示信息,并告知所查询的属性名。

阻止调用对象中的某个函数

Proxy 对象不仅可以拦截属性的访问,还可以拦截函数的调用。这在某些情况下可能非常有用。

下面是一个实现:

let obj = {
    add: function(a, b) {
        return a + b;
    },
    minus: function(a, b) {
        return a - b;
    }
};

let handler = {
    apply: function(target, thisArg, args) {
        if (target === obj.minus) {
            if (args[0] > args[1]) {
                return target.apply(thisArg, args);
            }
            else {
                throw new Error('Cannot execute the minus method, because the first parameter is less than the second parameter.');
            }
        } else {
            throw new Error('Cannot execute the add method.');
        }
    }
};

let proxy = new Proxy(obj, handler);

console.log(proxy.add(1, 2));                // Error: Cannot execute the add method.
console.log(proxy.minus(2, 1));              // 1
console.log(proxy.minus(1, 2));              // Error: Cannot execute the minus method, because the first parameter is less than the second parameter.

在该示例中,我们定义了一个 obj 对象,其中包含 addminus 两个函数。使用 new 操作符创建了 handler 对象,它覆盖了 apply 方法,从而拦截 obj 对象中所有函数的调用。

这里我们可以看到,当调用 add 方法时,handler.apply 方法会阻止它的执行并抛出一个错误。而当调用 minus 方法时,handler.apply 判断其传入的参数,只有在第一个参数大于第二个参数时才允许其执行,否则也会抛出一个错误。

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

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

相关文章

  • javascript数组去重方法分析

    一、问题背景 在前端开发中,我们经常需要对JavaScript数组进行去重操作,以便保证数据的一致性和完整性。那么JavaScript数组去重的方法有哪些呢?本文将对目前主流的JavaScript数组去重方法进行详细的分析和讲解。 二、方法分析 利用Set数据结构 Set是ES6中的一种数据结构,它类似于数组,但是成员的值都是唯一的,没有重复的值。我们可以通…

    JavaScript 2023年6月11日
    00
  • 纯原生js实现table表格的增删

    下面是关于纯原生JS实现table表格的增删的攻略: 实现前必备知识 在开始实现表格的增删功能之前,有几点需要准备: HTML表格的结构 css样式控制 表格数据的动态绑定 监听HTML元素的事件 通过JS操作HTML元素 实现过程 首先创建一个空表格,代码如下: “`html Name Age Gender 操作 “` 接着,在JS代码里,声明一个对象…

    JavaScript 2023年6月10日
    00
  • JS之判断是否为对象或数组的几种方式总结

    JS中判断一个变量是否为对象或数组是开发过程中经常会用到的操作。可以使用以下几种方式进行判断: 1. typeof 操作符 typeof 操作符通常用来判断一个变量的类型,可以通过判断返回值是否是 “object” 来判断一个变量是否为对象。需要注意的是,也可以使用 typeof 判断一个数组,但是返回值是 “object”,所以需要进行额外的判断。 以下是…

    JavaScript 2023年5月27日
    00
  • javascript 日期时间 转换的方法

    当需要对 JavaScript 中的日期时间格式进行转换时,我们可以使用以下方法: 获取当前时间 使用以下方法可以获取到当前时间: const now = new Date(); 其中,now就是获取到的当前时间,它的格式是日期对象。可以通过该对象的方法来对时间进行处理。 时间戳转化为日期时间格式 时间戳指的是从1970年1月1日00:00:00开始所经过的…

    JavaScript 2023年5月27日
    00
  • js实现各种复制到剪贴板的方法(分享)

    下面是js实现各种复制到剪贴板的方法的攻略: 一、前置知识 为了实现复制到剪贴板的功能,必须要掌握以下前置知识: Clipboard API:一种新的Web API,提供了操作剪贴板的标准接口,并且被主流浏览器所支持。 execCommand()方法:一种旧的Web API,已经被废弃,但是在Clipboard API出现之前是实现复制到剪贴板的常用方法。 …

    JavaScript 2023年6月11日
    00
  • 细说javascript函数从函数的构成开始

    细说JavaScript函数从函数的构成开始 JavaScript 函数是程序中的基础组件之一。在本文中,我们将深入了解 JavaScript 函数,包括函数的构成、参数传递和作为值的函数等。 函数的构成 JavaScript 函数由函数名称、参数列表、函数体和返回值组成。下面是一个最简单的 JavaScript 函数示例: function sayHell…

    JavaScript 2023年5月27日
    00
  • js 数组详细操作方法及解析合集

    JS 数组详细操作方法及解析合集 什么是数组? 在JavaScript中,数组是一种存储多个值的有序集合。数组中的每个值称为一个元素,每个元素都有一个相应的数字键(称为索引)来标识其在数组中的位置。 创建数组 在JavaScript中,有多种方式来创建数组。下面是一些示例: 使用数组字面量 数组字面量是用方括号 [] 包围并由逗号分隔构成的值序列,如下所示:…

    JavaScript 2023年5月18日
    00
  • 纯JS打造网页中checkbox和radio的美化效果

    让我来详细讲解一下“纯JS打造网页中checkbox和radio的美化效果”的完整攻略。 1. 美化checkbox 1.1 隐藏原生checkbox 首先,需要隐藏原生的checkbox,在CSS文件中添加以下样式: input[type="checkbox"] { visibility: hidden; position: absol…

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