详解JavaScript中的Proxy(代理)


当前第2页 返回上一页

以及如果我们想要对函数进行限制,禁止使用new关键字来调用,可以用另一个trap:construct

function add (a, b) {
  return a + b
}

let proxy = new Proxy(add, {
  construct (target, argumentsList, newTarget) {
    throw new Error(`Function ${target.name} cannot be invoked with 'new'`)
  }
})

proxy(1, 2)     // 3
new proxy(1, 2) // throw an error

用Proxy来包装fetch

在前端发送请求,我们现在经常用到的应该就是fetch了,一个原生提供的API。
我们可以用Proxy来包装它,使其变得更易用。

let handlers = {
  get (target, property) {
    if (!target.init) {
      // 初始化对象
      ['GET', 'POST'].forEach(method => {
        target[method] = (url, params = {}) => {
          return fetch(url, {
            headers: {
              'content-type': 'application/json'
            },
            mode: 'cors',
            credentials: 'same-origin',
            method,
            ...params
          }).then(response => response.json())
        }
      })
    }

    return target[property]
  }
}
let API = new Proxy({}, handlers)

await API.GET('XXX')
await API.POST('XXX', {
  body: JSON.stringify({name: 1})
})

GETPOST进行了一层封装,可以直接通过.GET这种方式来调用,并设置一些通用的参数。

实现一个简易的断言工具

写过测试的各位童鞋,应该都会知道断言这个东西
console.assert就是一个断言工具,接受两个参数,如果第一个为false,则会将第二个参数作为Error message抛出。
我们可以使用Proxy来做一个直接赋值就能实现断言的工具。

let assert = new Proxy({}, {
  set (target, message, value) {
    if (!value) console.error(message)
  }
})

assert['Isn\'t true'] = false      // Error: Isn't true
assert['Less than 18'] = 18 >= 19  // Error: Less than 18

统计函数调用次数

在做服务端时,我们可以用Proxy代理一些函数,来统计一段时间内调用的次数。
在后期做性能分析时可能会能够用上:

function orginFunction () {}
let proxyFunction = new Proxy(orginFunction, {
  apply (target, thisArg. argumentsList) {
    log(XXX)

    return target.apply(thisArg, argumentsList)
  }
})

全部的traps

这里列出了handlers所有可以定义的行为 (traps)

具体的可以查看MDN-Proxy
里边同样有一些例子

trapsdescription
get获取某个key
set设置某个key
has使用in操作符判断某个key是否存在
apply函数调用,仅在代理对象为function时有效
ownKeys获取目标对象所有的key
construct函数通过实例化调用,仅在代理对象为function时有效
isExtensible判断对象是否可扩展,Object.isExtensible的代理
deleteProperty删除一个property
defineProperty定义一个新的property
getPrototypeOf获取原型对象
setPrototypeOf设置原型对象
preventExtensions设置对象为不可扩展
getOwnPropertyDescriptor获取一个自有属性 (不会去原型链查找) 的属性描述

更多编程相关知识,请访问:编程学习网站!!

以上就是详解JavaScript中的Proxy(代理)的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

js怎么替换字符串?

javascript数字怎么转换为字符串

javascript可不可以跨平台

h5实现放大镜效果的代码

javascript怎么删除所有节点

javascript函数是什么

javascript怎么设置不可编辑

javascript怎么验证是否为数字

javascript实现间隔和延时的方法是什么

使用html5的canvas和javascript创建一个绘图程序的示例代码

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...