vue 2.5.1源码之Vue.extend和data合并策略的示例分析
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要介绍了vue 2.5.1源码之Vue.extend和data合并策略的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下
千家信息网最后更新 2025年11月13日vue 2.5.1源码之Vue.extend和data合并策略的示例分析
这篇文章主要介绍了vue 2.5.1源码之Vue.extend和data合并策略的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
1. 子类父类
2.Vue.extend() //创建vue的子类
组件的语法器 Vue.extend(options)
Profile().$mount('#app') // 挂在app上,并替换app
新建 initExend
==》 Vue.extend
3. strat.data
==> if(!vm){子组件中data的值是一个方法function ==> mergeDataorFn()} // 数据的合并
==> else {} //通过实例绑定的data 实际是一个函数 mergeDataorFn
==》 mergeDataorFn if(!vm) mergeDataFn ==> mergeData()
else ==》mergedInstanceDataFn ==>mergeData()
mergeData(to,from) //终极合并
jquery.extend // 深copy和浅copy
// 大体思路 (二)// 1. 子类父类 /* 2.Vue.extend() //创建vue的子类 组件的语法器 Vue.extend(options) Profile().$mount('#app') // 挂在app上,并替换app 新建 initExend ==》 Vue.extend*//* 3. strat.data ==> if(!vm){子组件中data的值是一个方法function ==> mergeDataorFn()} // 数据的合并 ==> else {} //通过实例绑定的data 实际是一个函数 mergeDataorFn ==》 mergeDataorFn if(!vm) mergeDataFn ==> mergeData() else ==》mergedInstanceDataFn ==>mergeData() mergeData(to,from) //终极合并 jquery.extend // 深copy和浅copy*/(function(global,factory){ // 兼容 cmd typeof exports === 'object' && module !== 'undefined' ? module.exports = factory(): // Amd typeof define === 'function' && define.amd ? define(factory) : global.Vue = factory();})(this,function(){ var uip = 0; function warn(string){ console.error('Vue Wran:' + string) } function resolveConstructorOptions(Con){ var options = Con.options; // 判断是否为vm的实例 或者是子类 return options } var hasOwnPropeerty = Object.prototype.hasOwnProperty function hasOwn(obj , key){ return hasOwnPropeerty.call(obj,key) } function makeMap(str, expectsLoweraseC){ if(expectsLoweraseC){ str = str.toLowerCase() } var map = Object.create(null) var list = str.split(',') for(var i = 0 ; i < list.length; i++){ map[list[i]] = true } return function(key){ return map[key] } } var isbuiltInTag = makeMap('slot,component',true) var isHTMLTag = makeMap( 'html,body,base,head,link,meta,style,title,' + 'address,article,aside,footer,header,h2,h3,h4,h5,h6,h7,hgroup,nav,section,' + 'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' + 'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' + 's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' + 'embed,object,param,source,canvas,script,noscript,del,ins,' + 'caption,col,colgroup,table,thead,tbody,td,th,tr,' + 'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' + 'output,progress,select,textarea,' + 'details,dialog,menu,menuitem,summary,' + 'content,element,shadow,template,blockquote,iframe,tfoot' ); var isSVG = makeMap( 'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' + 'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' + 'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view', true ); var isReservedTag = function(key){ return isHTMLTag(key) || isSVG(key) } function validataComponentName(key){ //检测component 的自定义名称是否合格 // 只能是字母开头或下划线,必须是字母开头 if(!(/^[a-zA-Z][\w-]*$/g.test(key))){ warn('组件的名称必须是字母或中横线,必须由字母开头') } // 1. 不能为内置对象,2.不能是html ,和avg的内部标签 if( isbuiltInTag(key) || isReservedTag(key)){ warn('不能为html标签或者avg的内部标签') } } function checkComonpents(child){ for(var key in child.component){ validataComponentName(key) } } // 配置对象 var config = { // 自定义的策略 optionMergeStrategies:{} } var strats = config.optionMergeStrategies strats.el = function(parent,child , key , vm){ if(!vm){ warn('选项'+key+'只能在vue实例用使用') } return defaultStrat(parent,child , key , vm) } function mergeData(to,form){ // 终极合并 if(!form){ return to } } function mergeDataorFn(parentVal,childVal,vm){ // 合并 parentVal childVal 都是函数 if(!vm){ if(!childVal){ return parentVal } if(!parentVal){ return childVal } return function mergeDataFn(parentVal,childVal,vm){//只是一个函数 什么样的情况下调用 加入响应式系统 // 合并子组件对应的data 和 父组件对应的data return mergeData( typeof parentVal === 'function' ? parentVal.call(this,this) : parentVal, // -----忘记写 typeof childVal === 'function' ? childVal.call(this,this): childVal) // -----忘记写 } }else{ // vue实例 return function mergeInstanceDataFn(parentVal,childVal,vm){//只是一个函数 什么样的情况下调用 加入响应式系统 var InstanceData = typeof childVal === 'function' ? childVal.call(vm,vm): childVal; // -----忘记写 var defaultData = typeof parentVal === 'function' ? parent.call(vm,vm): parentVal; // -----忘记写 if(InstanceData){ return mergeData(parentVal,childVal) }else{ // -----忘记写 defaultData } } } } strats.data = function(parent,child , key , vm){ if(!vm){ // console.log(typeof child === 'function') if(child && !(typeof child === 'function')){ warn('data必须返回是一个function') } return mergeDataorFn(parent,child) } return mergeDataorFn(parent,child,vm) } function defaultStrat(parent,child , key , vm){ return child === undefined ? parent :child ; } function mergeOptions(parent,child,vm){ var options = {} // 检测是component 是否是合法的 checkComonpents(child) // console.log(parent, child) for(key in parent){ magerField(key) } for(key in child){ if(!hasOwn(parent ,key)){ // parent 中循环过地方不进行循环 magerField(key) // ----忘记写 } } // 默认合并策略 function magerField(key){ // 自定义策略 默认策略 // console.log(key) var result = strats[key] || defaultStrat // ---忘记写 options[key] = result(parent[key],child[key] , key , vm) } // console.log(options) return options } function initMinxin(options){ Vue.prototype._init = function(options){ var vm = this // 记录生成的vue实例对象 vm._uip = uip++ // //-------忘记写 vm.$options =mergeOptions(resolveConstructorOptions(vm.constructor),options,vm) } } function Vue(options){ // 安全机制 if(!(this instanceof Vue)){ //-------忘记写 warn('Vue是一个构造函数,必须是由new关键字调用') } this._init(options) } initMinxin() // 初始化选项1: 规范 2: 合并策略。 Vue.options = { components: {}, directives:{}, _bash: Vue } function initExend(Vue){ Vue.extend = function(extendOptions){ extendOptions = extendOptions || {} // -----忘记写 var Super = this var Child = function VueComponent() { this._init(options) } Child.prototype = Object.create(Super.prototype) Child.prototype.constructor = Child // 改变constructor 的指向 Child.options = mergeOptions(Super.options,extendOptions) // 子类继承父类的静态方法。 Child.extend = Vue.extend return Child } } initExend(Vue) return Vue}) 感谢你能够认真阅读完这篇文章,希望小编分享的"vue 2.5.1源码之Vue.extend和data合并策略的示例分析"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
策略
组件
函数
子类
实例
字母
篇文章
对象
开头
方法
标签
终极
源码
示例
分析
只是
名称
实际
情况
数据
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广州五三互联网科技有限公司
elever数据库
开源的材料数据库
相机的影像数据库文件
环球网络安全教育平台
服务器主板安装普通内存条
金蝶7.5 数据库
马拉西亚服务器哪款好
网络安全服务 资质
json数据库列表
ldap服务器实现认证
对日java软件开发流程
网络安全手抄报装饰小图案
网络安全教育主题周
银行数据库安全么
小学网络安全宣传周讲话
常见的网络服务器种类有
证券公司软件开发待遇
黄埔专业网络安全运维
厦门惠榕软件开发
oracle数据库进程调整
魔兽服务器大小有区别吗
宽带改了网络安全密码就连不上了
手机网络软件开发
模拟城市与服务器
华为服务器开启超线程命令
非关系数据库设计权限
网络安全是什么级别
计算机系统引入数据库系统
收到的字符串怎样插入数据库