vue js 定义对象_JS标准内置对象Proxy及Vue中的proxy.js文件
昔登铜井望法华,葱茏螺黛浮蒹葭。今登法华望铜井,湖水迷茫烟色瞑。-- 《登法华寺山顶》
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是个什么鬼?
明天接着看看吧。
最后说两句
- 动一动您的小手,
「点个赞吧」
- 都看到这里了,不妨
「扫码加个关注」
vue js 定义对象_JS标准内置对象Proxy及Vue中的proxy.js文件相关推荐
- JS标准内置对象 数组 的 34 个方法
先放一个语雀的链接: https://www.yuque.com/docs/share/13314a2f-05c0-4de6-8d61-8acd9e566ad4?# <JS内置对象 Array& ...
- js笔记(四)内置对象Math和Date()、浏览器对象模型BOM
大标题 小标题 备注 一.内置对象Math.Date() 1. Math 数学对象; 2. Date() 日期对象; 常用的数学对象:Math.PI.abs(n).round(n).random(). ...
- 单体内置对象_单体内置对象
内置对象:由ECMAscript实现提供的,不依赖宿主环境的对象,这些对象再ES程序执行之前就已经存在 Global对象 Global全局对象是一个特别的对象(兜底对象) 不属于其他对象的属性和方法, ...
- jsp内置对象与el内置对象
jsp有九种内置对象 1). request 请求对象 javax.servlet.ServletRequest 当客户端向服务器端发送一个请求,服务器向客户端返回一个响应后,该请求对象就被销毁了; ...
- java中jsp内建对象有_JSP内置对象有哪些
JSP中的内置对象有:out应用程序.request应用程序.访问客户数据.response的应用.session的应用.application的应用.在web.xml中获取配置对象.获取异常信息等 ...
- javascript 回顾一下 基础标准内置对象 Object(二)
文章目录 一.Object 二.Object 构造函数的属性 1.Object.length 2.Object.prototype 3.Object.assign() 4.Object.create( ...
- python语言的内置对象类型_Python内置对象类型
核心数字类型: 数字:int,long,float,complex,bool 字符:str,unicode 列表:list 字典:dict 元组:tuple 文件:file 其他类型:集合(set), ...
- JS内置对象操作方法整理
JS对象操作方法整理 文章目录 JS对象操作方法整理 数组 ES5 ES6 字符串 String 日期 Date() 数字 Number 算数 Math 数组 ES5 concat() 连接两个或更多 ...
- JS内置引用类型/内置对象
JS内置引用类型/内置对象 概述 对象在 JavaScript 中被称为引用类型的值/实例,在 ECMAScript 中,引用类型是一种数据结构, 用于将数据和功能组织在一起.它也常被称为类,但这种称 ...
最新文章
- 《C#多线程编程实战(原书第2版)》——第3章 使用线程池 3.1 简介
- Javascript学习资源整理
- npm 安装less插件_Gulp 开发 HTML 静态页面和 Less 实时更新
- python3(八)sys模块
- C语言课后习题(5)
- 计算机组成中CM,基于TDN-CM++计算机组成原理课程设计.doc
- iOS 横竖屏切换解决方案
- 学习 jQuery -2 document 对象的 ready 事件
- c++学习笔记---指针
- 目标检测:YOLOV2
- 20年前的中国人怎么做3A大作?
- 深度学习 目标分类 思路
- 这可能是最全最好的BLAST教程
- node-@hapi/joi校验前端数据
- 国产操作系统银河麒麟V10桌面系统文件共享配置
- Windows 10 专业工作站 20H1 x64简单修改
- 做大数据风控,需要做哪些准备?
- 中高级Java开发应该要了解!我用2个月的时间破茧成蝶,醍醐灌顶!
- 图像或轮廓的Hu矩的定义、优缺点、适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配
- SimCSE论文及源码解读
热门文章
- php mysqli new 连接,php mysqli 连接数据库
- 数据oem 操作手册_海口电销外呼系统oem-河南爱聊科技
- android 消息循环滚动条,Android ViewPager实现循环滚动
- 时时监控程序运行的方法
- notebook中kiil进程从而释放显存的方法
- c语言中gets函数可以输入空格吗_C语言中scanf()与gets()函数的区别,哪一个可以读入空格啊?...
- usestate中的回调函数_React 中获取数据的 3 种方法:哪种最好?
- 天翼云从业认证(3.2)天翼云存储产品
- 【项目管理】ITTO-相关方管理
- Leaflet中通过setStyle实现图形样式编辑