JavaScript的Proxy对象详解

 更新时间:2022年01月07日 15:26:57   作者:Learn-anything  
这篇文章主要为大家介绍了JavaScript的Proxy对象,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

一、Proxy 是什么?

Proxy 对象用于拦截并修改目标对象的指定操作。

// 语法
const p = new Proxy(target, handler)
  • target :目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
  • handler :以函数作为属性的对象,实现拦截和自定义操作。

二、怎么用?

1、使用 Proxy 的简单实例

访问不存在的属性,设置默认值返回而不返回 undefined

// 1、找到合适的 handler 并编写代码
const handler = {
    get: function(obj, prop) {
        return prop in obj ? obj[prop] : 37;
    }
};
// 2、新建 Proxy 对象
const p = new Proxy({}, handler);
// 3、执行操作
p.a = 1;
p.b = undefined;
// 4、查看结果
console.log(p.a, p.b);      // 1, undefined
console.log('c' in p, p.c); // false, 37

2、目标对象被正确修改

let target = {};
let p = new Proxy(target, {});
p.a = 37;   // 操作转发到目标
console.log(target.a);    // 37. 操作已经被正确地转发

3、使用 set handler 做数据验证

let validator = {
  set: function(obj, prop, value) {
    if (prop === 'age') {
      if (!Number.isInteger(value)) {
        throw new TypeError('The age is not an integer');
      }
      if (value > 200) {
        throw new RangeError('The age seems invalid');
      }
    }
    // The default behavior to store the value
    obj[prop] = value;
    // 表示成功
    return true;
  }
};
let person = new Proxy({}, validator);
person.age = 100;
console.log(person.age);
// 100
person.age = 'young';
// 抛出异常: Uncaught TypeError: The age is not an integer
person.age = 300;
// 抛出异常: Uncaught RangeError: The age seems invalid

4、扩展构造函数

function extend(sup, base) {
  var descriptor = Object.getOwnPropertyDescriptor(
    base.prototype, "constructor"
  );
  base.prototype = Object.create(sup.prototype);
  var handler = {
    construct: function(target, args) {
      var obj = Object.create(base.prototype);
      this.apply(target, obj, args);
      return obj;
    },
    apply: function(target, that, args) {
      sup.apply(that, args);
      base.apply(that, args);
    }
  };
  var proxy = new Proxy(base, handler);
  descriptor.value = proxy;
  Object.defineProperty(base.prototype, "constructor", descriptor);
  return proxy;
}
var Person = function (name) {
  this.name = name
};
var Boy = extend(Person, function (name, age) {
  this.age = age;
});
Boy.prototype.sex = "M";
var Peter = new Boy("Peter", 13);
console.log(Peter.sex);  // "M"
console.log(Peter.name); // "Peter"
console.log(Peter.age);  // 13

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 基于匀速运动的实例讲解(侧边栏,淡入淡出)

    基于匀速运动的实例讲解(侧边栏,淡入淡出)

    下面小编就为大家带来一篇基于匀速运动的实例讲解(侧边栏,淡入淡出)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 深入理解JavaScript事件机制

    深入理解JavaScript事件机制

    事件机制是几乎所有开发语言都有的机制,并不是deviceone的独创,在某些语言称之为消息(Event),有些地方称之为(Message).接下来通过本文给大家介绍JS事件机制的理解 ,需要的朋友一起学习吧
    2023-04-04
  • JavaScript尾递归的实现及应用场景

    JavaScript尾递归的实现及应用场景

    本文主要介绍了JavaScript尾递归的实现及应用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • echarts展示区域地图添加纹理图片操作指南

    echarts展示区域地图添加纹理图片操作指南

    这篇文章主要给大家介绍了关于echarts展示区域地图添加纹理图片操作的相关资料,ECharts地图组件支持使用图片作为地图区域的填充纹理,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 判断ie的两种简单方法

    判断ie的两种简单方法

    判断ie想必大家都会写吧,如何将判断条件变得简单呢,也许大家并不是很清楚,感兴趣的大家可以参考下本文,或许会有所收获
    2013-08-08
  • 用JS判别浏览器种类以及IE版本的几种方法小结

    用JS判别浏览器种类以及IE版本的几种方法小结

    用JS判别浏览器种类以及IE版本的几种方法小结,需要的朋友可以参考下。
    2011-08-08
  • 微信小程序调用支付接口的完整流程记录

    微信小程序调用支付接口的完整流程记录

    我们在做小程序支付相关的开发时,总会遇到这些难题,下面这篇文章主要给大家介绍了关于微信小程序调用支付接口的完整流程,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 使用Axios拦截器优化HTTP请求与响应的实践案例

    使用Axios拦截器优化HTTP请求与响应的实践案例

    在前端开发中,HTTP 请求是与后端交互的重要方式,为了提高代码的可维护性、复用性以及用户体验,使用 Axios 拦截器是非常常见的做法,本文将详细介绍如何使用 Axios 的请求拦截器和响应拦截器,需要的朋友可以参考下
    2024-11-11
  • Three.Js实现看房自由小项目

    Three.Js实现看房自由小项目

    目前随着元宇宙概念的爆火,THREE技术已经深入到了物联网、VR、游戏、数据可视化等多个平台,今天我们主要基于THREE实现一个三维的VR看房小项目,感兴趣的朋友跟随小编一起看看吧
    2022-10-10
  • 动态的改变IFrame的高度实现IFrame自动伸展适应高度

    动态的改变IFrame的高度实现IFrame自动伸展适应高度

    动态的改变IFrame的高度,实现IFrame自动伸展,父页面也自动神缩原理: 在IFrame子页面一加载的时候,调用父IFrame对象,改变其高度
    2012-12-12

最新评论