昔登铜井望法华,葱茏螺黛浮蒹葭。今登法华望铜井,湖水迷茫烟色瞑。-- 《登法华寺山顶》

Proxy是什么

Proxy是JS标准内置对象中的一个对象。用于创建一个对象的代理。从而实现对对象操作的拦截及自定义,功能类似于Object.defineProperty();

Proxy语法解读

const res = new Proxy(target,handler);
  • target表示要包装的目标对象,可以是任意类型数组,函数,对象...
  • handler通常是一个函数作为属性的对象,比如{get:function(obj,prop){...}}

handler通常有以下几个方法

  • hander.get(target,property,receiver)。target表示目标对象。property表示被获取的属性名。receiver表示Proxy或者继承Proxy的对象。这个方法可以用来拦截属性值得读取操作。
const res = new Proxy({}, {  get: function(target, prop, receiver) {    console.log("called: " + prop);    return 'test';  }});

console.log(res.a); // "called: a"                  // test
  • handler.set(target, property, val)。target表示目标对象。property表示被设置的属性名。val表示新的属性值。这个方法可以用来设置属性值得读取操作。
const res = new Proxy({}, {  set: function(target, prop, val) {    target[prop] = val    return true;  }});res.test = '123'console.log(res.test);//123

Vue中的proxy.js文件

/* not type checking this file because flow doesn't play well with Proxy */

import config from 'core/config'import { warn, makeMap } from '../util/index'

let initProxy

if (process.env.NODE_ENV !== 'production') {  const allowedGlobals = makeMap(    'Infinity,undefined,NaN,isFinite,isNaN,' +    'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +    'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +    'require' // for Webpack/Browserify  )

  const warnNonPresent = (target, key) => {    warn(      `Property or method "${key}" is not defined on the instance but ` +      'referenced during render. Make sure that this property is reactive, ' +      'either in the data option, or for class-based components, by ' +      'initializing the property. ' +      'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',      target    )  }

  const hasProxy =    typeof Proxy !== 'undefined' &&    Proxy.toString().match(/native code/)

  if (hasProxy) {    const isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact')    config.keyCodes = new Proxy(config.keyCodes, {      set (target, key, value) {        if (isBuiltInModifier(key)) {          warn(`Avoid overwriting built-in modifier in config.keyCodes: .${key}`)          return false        } else {          target[key] = value          return true        }      }    })  }

  const hasHandler = {    has (target, key) {      const has = key in target      const isAllowed = allowedGlobals(key) || key.charAt(0) === '_'      if (!has && !isAllowed) {        warnNonPresent(target, key)      }      return has || !isAllowed    }  }

  const getHandler = {    get (target, key) {      if (typeof key === 'string' && !(key in target)) {        warnNonPresent(target, key)      }      return target[key]    }  }

  initProxy = function initProxy (vm) {    if (hasProxy) {      // determine which proxy handler to use      const options = vm.$options      const handlers = options.render && options.render._withStripped        ? getHandler        : hasHandler      vm._renderProxy = new Proxy(vm, handlers)    } else {      vm._renderProxy = vm    }  }}

export { initProxy }

makeMap()方法。

这个方法创建了一个Map结构,并且返回了一个方法用来检测指定的key是否在这个Map中。

export function makeMap (  str: string,  expectsLowerCase?: boolean): (key: string) => true | void {  const map = Object.create(null)  const list: Array = str.split(',')for (let i = 0; i     map[list[i]] = true  }return expectsLowerCase    ? val => map[val.toLowerCase()]    : val => map[val]}

接下来判断浏览器是否支持proxy

const hasProxy =    typeof Proxy !== 'undefined' &&    Proxy.toString().match(/native code/)

之后将配置中keycodes做一层代理

const isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact')    config.keyCodes = new Proxy(config.keyCodes, {      set (target, key, value) {        if (isBuiltInModifier(key)) {          warn(`Avoid overwriting built-in modifier in config.keyCodes: .${key}`)          return false        } else {          target[key] = value          return true        }      }    })  }

之后定义hasHandler和getHandler

const hasHandler = {    has (target, key) {      const has = key in target      const isAllowed = allowedGlobals(key) || key.charAt(0) === '_'      if (!has && !isAllowed) {        warnNonPresent(target, key)      }      return has || !isAllowed    }  }

  const getHandler = {    get (target, key) {      if (typeof key === 'string' && !(key in target)) {        warnNonPresent(target, key)      }      return target[key]    }  }

最后,定义了initProxy方法。

将vue实例vm作为参数,根据实例的options.render切换了hander,然后有在vm实例上定义了_renderProxy作为vm的代理。

initProxy = function initProxy (vm) {    if (hasProxy) {      // determine which proxy handler to use      const options = vm.$options      const handlers = options.render && options.render._withStripped        ? getHandler        : hasHandler      vm._renderProxy = new Proxy(vm, handlers)    } else {      vm._renderProxy = vm    }  }

那么问题来了,options.render是个什么鬼?

明天接着看看吧。

最后说两句

  1. 动一动您的小手,「点个赞吧」
  2. 都看到这里了,不妨  「扫码加个关注」

javascript基础知识总结

vue js 定义对象_JS标准内置对象Proxy及Vue中的proxy.js文件相关推荐

  1. JS标准内置对象 数组 的 34 个方法

    先放一个语雀的链接: https://www.yuque.com/docs/share/13314a2f-05c0-4de6-8d61-8acd9e566ad4?# <JS内置对象 Array& ...

  2. js笔记(四)内置对象Math和Date()、浏览器对象模型BOM

    大标题 小标题 备注 一.内置对象Math.Date() 1. Math 数学对象; 2. Date() 日期对象; 常用的数学对象:Math.PI.abs(n).round(n).random(). ...

  3. 单体内置对象_单体内置对象

    内置对象:由ECMAscript实现提供的,不依赖宿主环境的对象,这些对象再ES程序执行之前就已经存在 Global对象 Global全局对象是一个特别的对象(兜底对象) 不属于其他对象的属性和方法, ...

  4. jsp内置对象与el内置对象

    jsp有九种内置对象 1). request 请求对象 javax.servlet.ServletRequest 当客户端向服务器端发送一个请求,服务器向客户端返回一个响应后,该请求对象就被销毁了; ...

  5. java中jsp内建对象有_JSP内置对象有哪些

    JSP中的内置对象有:out应用程序.request应用程序.访问客户数据.response的应用.session的应用.application的应用.在web.xml中获取配置对象.获取异常信息等 ...

  6. javascript 回顾一下 基础标准内置对象 Object(二)

    文章目录 一.Object 二.Object 构造函数的属性 1.Object.length 2.Object.prototype 3.Object.assign() 4.Object.create( ...

  7. python语言的内置对象类型_Python内置对象类型

    核心数字类型: 数字:int,long,float,complex,bool 字符:str,unicode 列表:list 字典:dict 元组:tuple 文件:file 其他类型:集合(set), ...

  8. JS内置对象操作方法整理

    JS对象操作方法整理 文章目录 JS对象操作方法整理 数组 ES5 ES6 字符串 String 日期 Date() 数字 Number 算数 Math 数组 ES5 concat() 连接两个或更多 ...

  9. JS内置引用类型/内置对象

    JS内置引用类型/内置对象 概述 对象在 JavaScript 中被称为引用类型的值/实例,在 ECMAScript 中,引用类型是一种数据结构, 用于将数据和功能组织在一起.它也常被称为类,但这种称 ...

最新文章

  1. 《C#多线程编程实战(原书第2版)》——第3章 使用线程池 3.1 简介
  2. Javascript学习资源整理
  3. npm 安装less插件_Gulp 开发 HTML 静态页面和 Less 实时更新
  4. python3(八)sys模块
  5. C语言课后习题(5)
  6. 计算机组成中CM,基于TDN-CM++计算机组成原理课程设计.doc
  7. iOS 横竖屏切换解决方案
  8. 学习 jQuery -2 document 对象的 ready 事件
  9. c++学习笔记---指针
  10. 目标检测:YOLOV2
  11. 20年前的中国人怎么做3A大作?
  12. 深度学习 目标分类 思路
  13. 这可能是最全最好的BLAST教程
  14. node-@hapi/joi校验前端数据
  15. 国产操作系统银河麒麟V10桌面系统文件共享配置
  16. Windows 10 专业工作站 20H1 x64简单修改
  17. 做大数据风控,需要做哪些准备?
  18. 中高级Java开发应该要了解!我用2个月的时间破茧成蝶,醍醐灌顶!
  19. 图像或轮廓的Hu矩的定义、优缺点、适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配
  20. SimCSE论文及源码解读

热门文章

  1. php mysqli new 连接,php mysqli 连接数据库
  2. 数据oem 操作手册_海口电销外呼系统oem-河南爱聊科技
  3. android 消息循环滚动条,Android ViewPager实现循环滚动
  4. 时时监控程序运行的方法
  5. notebook中kiil进程从而释放显存的方法
  6. c语言中gets函数可以输入空格吗_C语言中scanf()与gets()函数的区别,哪一个可以读入空格啊?...
  7. usestate中的回调函数_React 中获取数据的 3 种方法:哪种最好?
  8. 天翼云从业认证(3.2)天翼云存储产品
  9. 【项目管理】ITTO-相关方管理
  10. Leaflet中通过setStyle实现图形样式编辑