proxy代理面试题

1、动态属性值

const r1=add[1][2][3]+4//输出10
const r2=add[10][20]+30//输出60
const r3=add[100][200][300]+400//输出1000

柯里化,有参考下文
https://blog.csdn.net/p1967914901/article/details/127621032

add 是对象,通过链式传入属性求和返回结果,咱们会想到代理proxy

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

其中 target 是我们要代理的对象,handler 则是以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理 p 的行为。详细介绍请看 MDN 文档

	let add = new Proxy(
            {_store:0},
            {
                get(target, property, receiver) {
                    target['_store'] += +property
                    console.log(target['_store'])
                    return receiver
                }
            });
    add[2][3][10]+3

运行到+3的时候,上面+p报错
在这里插入图片描述

其中 target 是目标对象,property 是被获取的属性名,receiver 是 Proxy 或者继承 Proxy 的对象。

let add = new Proxy(
            {_store: 0},
            {
                get(target, property, receiver) {
                    // console.log(property)//Symbol(Symbol.toPrimitive)
                    // 遇到 + 的操作,会触发隐式类型转换
                    if (property === Symbol.toPrimitive) {
                        return () => {
                            return target['_store']
                        }
                    } else {
                        target['_store'] += +property
                        // console.log(target['_store'])
                        return receiver
                    }
                }
            });
    console.log(add[2][3][10] + 3)

2、以同步的方式实现事件监听

生产环境不要写,仅做扩展

// 请完成getElement函数让后续程序顺利执行,cssSelector为css选择器
function getElement(cssSelector) {

}
(async () => {
    const btn = getElement('button')
    while(1) {
        await btn.waitClick;//这里的async await在消除事件回调
        console.log('按钮被点击了')
    }
})()
 function getElement(cssSelector) {
      const dom = document.querySelector(cssSelector)
      return dom 
 };
 //这样写的话相当于题目中 await btn.waitClick=await undefined=await Promise.resolve()
 function getElement(cssSelector) {
      const dom = document.querySelector(cssSelector)
      dom.waitClick=new Promise((resolve)=>{
			dom.click=resolve
	   })
      return dom 
 };
//不太通用,waitClick,waitFocus
 <button>以同步的方式实现事件监听</button>

// 请完成getElement函数让后续程序顺利执行
    function getElement(cssSelector) {
      const dom = document.querySelector(cssSelector)
      // 使用Proxy代理dom,拦截所有属性访问,实现事件监听
      const proxy = new Proxy(dom, {
        get(target, key) {
          // 若发现属性非wait开头,则返回原始对象
          if (!key.startsWith('wait')) {
            return Reflect.get(target, key)
          }
          // 截取wait后面的字符串并转换为小写,既为事件名称
          const eventName = key.replace('wait', '').toLowerCase()
          // 返回一个Promise,当事件触发时resolve
          return new Promise((resolve) => {
            // 事件只需要监听一次即可
            dom.addEventListener(eventName, resolve, { once: true })
          })
        },
      })
      return proxy
    };
    (async () => {
      const btn = getElement('button')
      //   while (1) {
      //     await btn.waitClick
      //     console.log('按钮被点击了')
      //   }
      // 仅仅监听10次
      for (let i = 0; i < 10; i++) {
        await btn.waitClick
        console.log('按钮被点击了')
      }
    })()

3、和defineProperty的区别

proxy,能够拦截和重新定义对象的基本操作
对象的基本操作指的是以下等
在这里插入图片描述
Object.defineProperty最后就是转换为[[DefineOwnProperty]]使用
假如是个函数的话还会多两个基本操作[[call]] [[construct]]
————————————
proxy能够拦截和重新定义对象的基本操作
在这里插入图片描述
defineProperty本身就是个基本操作,只是众多基本操作的其中一个
比方说,以下会报错,这种操作无法重新定义
在这里插入图片描述
这一点假如考vue响应式也应该提一嘴
在这里插入图片描述
黄色表示vue2重写的数组方法
而vue3使用的是proxy代理,可以拦截对象的所有操作
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当面试官问到关于Nginx的常见面试题时,以下是一些可能会被问到的问题及其回答: 1. 什么是Nginx? Nginx是一个高性能的开源Web服务器和反向代理服务器。它可以处理大量并发连接,并具有低内存消耗的特点,因此被广泛用于构建高性能的Web应用和服务。 2. Nginx的主要特点有哪些? Nginx的主要特点包括: - 高性能:Nginx采用异步非阻塞的事件驱动模型,能够处理大量并发连接。 - 负载均衡:Nginx可以作为反向代理服务器,实现负载均衡,将请求分发到多个后端服务器上。 - 高可靠性:Nginx具有自动故障恢复和热部署的能力,可以保证服务的高可用性。 - 动态模块化:Nginx支持动态加载模块,可以根据需要添加或删除功能模块。 - 可扩展性:Nginx可以通过添加第三方模块来扩展功能,满足不同场景的需求。 3. Nginx和Apache有什么区别? Nginx和Apache是两种常见的Web服务器软件,它们之间的区别包括: - 连接处理方式:Nginx采用异步非阻塞的事件驱动模型,而Apache采用多进程或多线程模型。 - 内存消耗:Nginx的内存消耗相对较低,适合处理大量并发连接;而Apache的内存消耗相对较高。 - 静态文件处理:Nginx在处理静态文件时效率更高,而Apache在处理动态内容和模块化方面更强大。 - 配置方式:Nginx的配置文件相对简洁,语法更加简单易懂;而Apache的配置文件相对复杂。 4. 如何配置Nginx实现反向代理? 要配置Nginx实现反向代理,可以按照以下步骤进行: - 在Nginx的配置文件中,使用`location`指令指定需要代理的请求路径。 - 使用`proxy_pass`指令指定代理的目标服务器地址。 - 可选地,可以使用`proxy_set_header`指令设置代理请求头信息。 - 保存配置文件并重新加载Nginx。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值