/*css*/Vue定义了一些API,然后放在Vue对象上,方便在Vue项目中全局使用Vue.extendVue.extend。Vue.extend的参数是一个组件的选项,然后返回一个用于生成新组件的构造函数。期权的属性是什么?想象一下我们平时写的Vue组件,主要包括模板、数据、方法和生命周期函数。demo可以查看Vue文档,下面是粘贴的源码。functioninitExtend(Vue){/***每个实例构造函数,包括Vue,都有一个唯一的*cid。这使我们能够为原型继承创建包装的“子*构造函数”并缓存它们。*/Vue.cid=0;变种=1;/***类继承*/Vue.extend=function(extendOptions){extendOptions=extendOptions||{};变种超级=这个;varSuperId=Super.cid;varcachedCtors=extendOptions._Ctor||(extendOptions._Ctor={});如果(cachedCtors[SuperId]){returncachedCtors[SuperId]}varname=extendOptions.name||超级选项名称;如果(名称){验证组件名称(名称);}varSub=functionVueComponent(options){this._init(options);};Sub.prototype=Object.create(Super.prototype);Sub.prototype.constructor=Sub;sub.cid=cid++;Sub.options=mergeOptions(Super.options,extendO选项);子['超级']=超级;//对于props和计算属性,我们在扩展时在扩展原型上的//Vue实例上定义代理getter。这//避免为每个创建的实例调用Object.defineProperty。如果(Sub.options.props){initProps$1(Sub);}if(Sub.options.computed){initComputed$1(Sub);}//允许进一步扩展/混合/插件使用Sub.extend=Super.extend;Sub.mixin=Super.mixin;Sub.use=Super.use;//创建资产寄存器,因此扩展类//也可以拥有它们的私有资产。ASSET_TYPES.forEach(function(type){Sub[type]=Super[type];});//启用递归自查找if(name){Sub.options.components[name]=Sub;}//在扩展时保留对超级选项的引用。//稍后在实例化时我们可以检查Super的选项是否已经//updated.Sub.superOptions=Super.options;Sub.extendOptions=extendOptions;Sub.sealedOptions=extend({},Sub.options);//缓存构造函数cachedCtors[SuperId]=Sub;返回子};}initExtend函数定义的Vue.extend方法,Vue.cid等于0,即后面代码中的SuperId不变,变量cid表示组件id放在构造函数中,新组件通过自增保持唯一id。直接看Vue.extend对应的方法,extendOptions参数就是上面说的传入的组件options,为了方便我们调用组件参数OPTIONS,此时执行函数super等于this,表示指向Vue,访问OPTIONS中的_Ctor,字面意思同在后面的操作中,可以看出,如果构造函数被缓存,则直接返回。这里我们抱着新建组件构造函数的思路看代码。首先检查OPTIONS中的名称是否符合规范,然后是主体部分,声明组件的构造函数Sub,子类Sub继承父类Vue,然后将构造函数指向回自己,然后定义自己的组件id,和合并选项,定义一个属性super指向Vue。接下来有评论说props和computed是通过代理访问的,然后Vue挂载的方法也是挂载到Sub上……反正很多挂载都是为了方便访问。在定义Sub.sealedOptions属性时,使用了一个extend方法,这个方法与Vue.extend无关,它实现了一个类似于Object.assign的功能。最后执行cachedCtors[SuperId]=Sub,就是把构造函数存放在OPTIONS属性_Ctor中,解释了之前的构造函数缓存,避免重复创建构造函数。结合平时的业务,我们在使用elementUI的消息提示时,直接通过Vue实例上的this.$message方法调用。像弹框一样把组件标签放在组件模板中,通过显示和隐藏来控制,太麻烦了。所以这里举个栗子实现一个加载组件的功能使用