vue 2.5.1源码之Vue.extend和data合并策略的示例分析
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了vue 2.5.1源码之Vue.extend和data合并策略的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下
千家信息网最后更新 2026年11月03日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安全错误
数据库的锁怎样保障安全
互联网巨头反垄断金融科技
礼当家互联网科技
互联网女皇 腾讯科技
上海万想互联网科技
互联网科技美容
互联网巨头投资的硬核科技
广西拼得多互联网科技有限公司
银川新华互联网科技学校地址
博兴的互联网电子科技公司
玖二柒互联网科技公司待遇
互联网科技实习生岗位职责
重庆互联网医院沙龙医盟信息科技
互联网科技革命什么开始
和信科技工业互联网
洛阳昕诺飞互联网科技有限公司
互联网科技的全部知识
21世纪互联网科技成就
35岁以上互联网科技行业
上海乐五互联网科技有限公司
互联网科技新闻
什么是科技互联网
互联网科技公司排名
互联网科技股票
华中科技大学互联网
汉立互联网科技有限公司联系电话
青岛科技大学互联网大赛研究生
工业互联网展湾科技股份有限公司
抖集互联网科技技术咨询
瑞安市蟠桃会互联网科技有限公司
每日互联网科技新闻