我的网站开发技术经验总结 我的网站开发技术经验总结
首页

fangdown

我的网站开发技术经验总结
首页
  • 大前端

  • 基础

    • js

    • css

    • ES6

      • 说说对模块化的理解
      • 说说ES6中对象新增了哪些扩展
      • 说说ES6中函数新增了哪些扩展
      • ES6中数组的常用方法
      • 说说ES6中新增的Set、Map的区别
      • 说说ES6中Decorator的理解
      • 说说ES6中Generator的应用
      • 说说ES6中Promise的常用方法及原理
      • 说说ES6中Proxy的理解
        • 是什么
        • 怎么用
        • 使用场景
        • FAQ
      • 说说var、let、const之间的区别
  • 框架

  • 情商

  • 算法

  • 网络

  • 千锤百炼
  • 基础
  • ES6
fangdown
2021-08-19
目录

说说ES6中Proxy的理解

# 是什么

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

# 怎么用

var proxy = new Proxy(target, handler);
  • target,操作对象
  • handler, 处理集合
  get(target,propKey,receiver):拦截对象属性的读取
  set(target,propKey,value,receiver):拦截对象属性的设置
  has(target,propKey):拦截propKey in proxy的操作,返回一个布尔值
  deleteProperty(target,propKey):拦截delete proxy[propKey]的操作,返回一个布尔值
  ownKeys(target):拦截Object.keys(proxy)、for...in等循环,返回一个数组
  getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象
  defineProperty(target, propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc),返回一个布尔值
  preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值
  getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象
  isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值
  setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值
  apply(target, object, args):拦截 Proxy 实例作为函数调用的操作
  construct(target, args):拦截 Proxy 实例作为构造函数调用的操作

# 使用场景

类似于设计模式中的代理模式

  • 拦截和监视外部对对象的访问
  • 降低函数或类的复杂性
  • 在复杂操作前进行校验或多所需资源进行管理
let api = {
  _apiKey: "123abc456def",
  getUsers: function() {},
  getUser: function(userId) {},
  setUser: function(userId, config) {},
};
const RESTRICTED = ["_apiKey"];
api = new Proxy(api, {
  get(target, key, proxy) {
    if (RESTRICTED.indexOf(key) > -1) {
      throw Error(`${key} 不可访问.`);
    }
    return Reflect.get(target, key, proxy);
  },
  set(target, key, value, proxy) {
    if (RESTRICTED.indexOf(key) > -1) {
      throw Error(`${key} 不可修改`);
    }
    return Reflect.get(target, key, value, proxy);
  },
});

console.log(api._apiKey);
api._apiKey = "987654321";
// 上述都抛出错误

# FAQ

上次更新: 2021/12/19, 18:05:42
说说ES6中Promise的常用方法及原理
说说var、let、const之间的区别

← 说说ES6中Promise的常用方法及原理 说说var、let、const之间的区别→

最近更新
01
多分支修复撞车的问题
05-01
02
如何成为架构师
01-23
03
服务器部署全过程
11-23
更多文章>
Theme by Vdoing | Copyright © 2019-2026 fangdown | 粤ICP备19079809号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式