首页 > 其他分享 >什么是Proxy?

什么是Proxy?

时间:2023-04-27 19:11:43浏览次数:25  
标签:obj log 什么 prop let Proxy console

Proxy对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)

 

语法

const p = new Proxy(target, handler)

参数说明

target 要使用Proxy包装的目标对象
handler 处理器对象

 

 

 

创建一个可撤销的Proxy对象

Proxy.revocable()

 

基础示例

const handler = {
  get: function(obj, prop) {
    return prop in obj ? obj[prop] : 37
  }
}

const p = new Proxy({}, handler)
p.a = 1
p.b = undefined

console.log(p.a, p.b) // 1, undefined
console.log('c' in p, p.c) // false, 37

 

无操作转发代理

let target = {}
let p = new Proxy(target, {})

p.a = 37 // 操作转发到目标

console.log(target.a) // 37

 

验证

通过代理,你可以轻松地验证向一个对象的传值。

 1 let validator = {
 2   set: function(obj, prop, value) {
 3     if (prop === 'age') {
 4       if (!Number.isInteger(value)) {
 5         throw new TypeError('The age is not an integer')
 6       }
 7       if (value > 200) {
 8         throw new RangeError('The age seems invalid')
 9       }
10     }
11 
12     obj[prop] = value;
13 
14     return true; // 表示成功
15   }
16 }
17 
18 let person = new Proxy({}, validator)
19 
20 person.age = 100
21 
22 console.log(person.age)
23 
24 person.age = 'young'
25 person.age = 300

 

操作DOM节点

有时候可能需要互换两个不同元素的属性或类名,下面的代码以此为目标,展示了set handler的使用场景

let view = new Proxy({
  selected: null
}, {
  set: function(obj, prop, newval) {
    let objval = obj[prop]

    if (prop === 'selected') {
      if (oldval) {
        oldval.setAttribute('aria-selected', 'false')
      }
      if (newval) {
        newval.setAttribute('aria-selected', 'true')
      }
    }

    obj[prop] = newval

    return true; // 表示操作成功
  }
})

let i1 = view.selected = document.getElementById('item-1')
console.log(i1.getAttribute('aria-selected')) // 'true'

let i2 = view.selected = document.getElementById('item-2')
console.log(i1.getAttribute('aria-selected')) // 'false'
console.log(i2.getAttribute('aria-selected')) // 'true'

 

通过属性查找数组中的特定对象

以下代理为数组扩展了一些实用工具。

let products = new Proxy([{
  name: 'Firefox',
  type: 'browser'
}, {
  name: 'SeaMonkey',
  type: 'browser'
},
{
  name: 'Thunderbird',
  type: 'mailer'
}], {
  get: function(obj, prop) {
    // 默认行为是返回属性值,prop通常是一个整数
    if (prop in obj) {
      return obj[prop]
    }

    if (prop === 'number') {
      return obj.length
    }

    let result, types = {};

    for (let product of obj) {
      if (product.name === prop) {
        result = product;
      }
      if (types[product.type]) {
        types[product.type].push(product)
      } else {
        types[product.type] = [product]
      }
    }

    // 通过name获取product
    if (result) {
      return result;
    }

    // 通过type获取products
    if (prop in types) {
      return types[prop]
    }

    // 获取product type
    if (prop === 'types') {
      return Object.keys(types)
    }

    return undefined;
  }
})

// console.log(products[0])
// console.log(products['Firefox'])
console.log(products['Chrome']) // undefined
console.log(products.browser)
console.log(products.types) // ['browser', 'mailer']
console.log(products.number) // 3

 

 

内容摘自文档:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy

标签:obj,log,什么,prop,let,Proxy,console
From: https://www.cnblogs.com/cathy1024/p/17359991.html

相关文章

  • ATT&CK是什么
    ATT&CK是什么一、ATT&CK官网ATT&CK,AdversarialTactics,Techniques,andCommonKnowledge,对抗战术、技术与通用知识。官网:https://attack.mitre.org/ 二、ATT&CK说了什么想要看懂ATT&CK说了什么,首先要做两件事,第一件是看懂网站的各个主题说了什么,第二件是看懂各个主......
  • 什么是好的 API 文档?
    接口文档是描述如何与软件系统中的特定接口进行交互的文档,通常包含接口的名称、描述、请求和响应的格式、参数、返回值、错误码、调用示例等信息。它是开发人员在设计和开发软件系统时必不可少的参考资料。日常工作中,运用接口文档最多的是前后端的同学,因为要遵守各自的规范流程,所......
  • jq中的九大选择器有哪些?作用是什么?
    jQuery中的九大选择器如下:元素选择器(ElementSelector):使用元素名称来选择HTML元素。如$('p')选取所有<p>元素。ID选择器(IDSelector):使用元素的ID属性来选择HTML元素。如$('#myId')选取ID为'myId'的元素。类选择器(ClassSelector):使用元素的class属性来选......
  • abstract class和interface有什么区别?
    声明方法的存在而不去实现它的类被叫做抽象类(abstractclass),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静......
  • 为什么FIFO 第一轮读出数据正确,第二轮读出数据的时候读出的是x?FIFO 读出数据有误
    仿真如下所示,第一轮写入12345678读出来都是对的,后来写9 1011...等,读出来就是x了,这是为什么呢?  这说明指针在指到FIFO尽头以后出了什么问题。。。。。 最后发现是这里指针的位宽是3,结果定义为了4位,这样的话,当你指针累计到111的时候并没有返回到000,而是指到......
  • bsp是什么?
    BSP是BinarySpace Partitioning(二叉空间分割)的缩写,是另一种类型的空间分割技术,在游戏工业上应用了,Doom是第一个使用BSP树的商业游戏。参考:https://baike.baidu.com/item/bsp/4572765?fr=aladdin这种方法很有用因为它能在早期排除大量的多边形,所以在最后我们仅仅是对少数面进行......
  • 编程开发8大语言详解,为什么Java是我最推荐的?
    一.前言很多没有接触过编程语言的同学,都会觉得编程开发特别高端和神奇,担心理解不了更担心学不会。当然,也有人会认为,你既然是做编程的,那么你应该什么都会,什么软件的开发都能完成,这是平哥经常听到的两种声音。在此,平哥需要给大家科普一下,编程确实改变了这个世界,但这是所有编程人......
  • 当我第一次通过Kotlin和Compose来实现一个Canvas时, 我收获了什么?
    当我第一次通过Kotlin和Compose来实现一个Canvas时,我收获了什么?自从2019年Google推荐Kotlin为Android开发的首选语言以来已经经历了将近四年的时间,Compose的1.0版本也发布了将近2年的时间,Kotlin+Compose在现阶段的Android开发过程中还远远达不到主流的程度.我们是否应该......
  • 我用这个代码识别简单的图片为什么识别不出来?
    今日鸡汤我家襄水曲,遥隔楚云端。大家好,我是皮皮。一、前言前几天在Python黄金交流群【。】问了一个Python图像处理的问题,下图是截图:输出的结果是空白:二、实现过程这里【走进未来】给了一个可行的代码,importddddocrocr=ddddocr.DdddOcr()withopen('1.png','rb')asf:img_b......
  • Docker学习笔记(1)-docker对比传统虚拟机有什么作用
    一个新技术的出现,一定是解决了很多老技术存在的问题。那么docker解决了什么问题呢?首先我们传统的虚拟机技术。虽然能够虚拟出完整的操作系统和硬件使用。但是其容器太臃肿了,如果我们仅仅只需要发布一些项目到里面的话那么太重量了。而且传统虚拟机安装没个半个小时搞不出来,所以我......