Vue.use源码分析


Posted in Javascript onApril 22, 2017

我想有过vue开发经验的,对于vue.use并不陌生。当使用vue-resource或vue-router等全局组件时,必须通过Vue.use方法引入,才起作用。那么vue.use在组件引入之前到底做了那些事情呢?让我们一窥究竟。

先上vue.use源码

// javascript的方法是可以传递的,哈哈
Vue.use = function (plugin) {
  /* istanbul ignore if */
  if (plugin.installed) {
   return
  }
  // additional parameters
  var args = toArray(arguments, 1);
  args.unshift(this);
  if (typeof plugin.install === 'function') {
   plugin.install.apply(plugin, args);
  } else if (typeof plugin === 'function') {
   plugin.apply(null, args);
  }
  plugin.installed = true;
  return this
 };

假设我们通过Vue.use引入一个插件plugin(该插件可以暂时理解为一个变量或参数),即Vue.use(plugin); 

首先判断传入的参数plugin的属性installed是否存在,如果存在且逻辑值为真,那么直接返回,后边的代码就不会再执行,这个判断的作用是什么呢?后边会讲到。 

我们先假设plugin的属性installed不存在或为假,那么继续往下执行。

var args = toArray(arguments, 1);

//执行了一个toArray方法,toArray接收了两个参数,arguments为Vue.use方法传入的参数集合,例如Vue.use(a,b,c),那么arguments类似于[a,b,c](说明:arguments只是类数组,并不是真正的数组)。此处因为只引入一个参数plugin,所以arguments类似于[plugin]。

toArray的作用是什么呢?看源码。

function toArray (list, start){
 start = start || 0;
 var i = list.length - start;
 var ret = new Array(i);
 while (i--) {
 ret[i] = list[i + start];
 }
 return ret
}

当执行toArray(arguments,1),会生成一个新数组ret,长度 = arguments.length-1,然后进行while循环,依次倒序把arguments的元素赋值给ret,因为ret比arguments长度少1,所以最终等同于arguments把除了第一个元素外的其余元素赋值给ret。toArray主要作用就是把类数组转化为真正的数组,这样才能调用数组的方法。因为此处我只引入一个plugin参数,即arguments=[plugin],所以toArray返回为空数组[]。

接着往下执行,args.unshift(this),等同于[].unshift(Vue),即args = [Vue];然后执行

if (typeof plugin.install === 'function') {
  plugin.install.apply(plugin, args);
 } else if (typeof plugin === 'function') {
  plugin.apply(null, args);
 }

此处判断plugin的install是否为函数,如果为函数,立即执行pluign.install方法,install方法传入的参数为args内数组元素,即install接受的第一个参数为Vue.

如果plugin的install不是函数,那么判断plugin本身是否为函数,如果为函数,那么执行plugin函数,且参数为args内数组元素。

最后设置plugin.installed为true。设置plugin.installed为true的作用是避免同一个插件多次执行安装,比如Vue.use(plugin)执行一次之后,installed为true,再次执行的话走到第一步判断就返回了。

综上所述,Vue.use的作用其实就是执行一个plugin函数或者执行pluign的install方法进行插件注册,并且向plugin或其install方法传入Vue对象作为第一个参数,use的其他参数作为plugin或install的其他参数。

举个简单的例子

import Vue from 'vue'

function test(a){
 console.log(a);//Vue
}

function test1(a,b){
console.log(a,b);//Vue hello
}

let oTest = {
 install:function(a,b){
  console.log(a,b);//Vue hello1
 }
}

Vue.use(test);
Vue.use(test1,'hello');
Vue.use(oTest,'hello1');
console.log(oTest);
//{

install:function(){...},

installed:true
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
这段js代码得节约你多少时间
Dec 20 Javascript
一个JavaScript变量声明的知识点
Oct 28 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
Nov 22 Javascript
jQuery中:last-child选择器用法实例
Dec 31 Javascript
javascript中返回顶部按钮的实现
May 05 Javascript
很酷的星级评分系统原生JS实现
Aug 25 Javascript
package.json文件配置详解
Jun 15 Javascript
JS随机排序数组实现方法分析
Oct 11 Javascript
ionic使用angularjs表单验证(模板验证)
Dec 12 Javascript
实现elementUI表单的全局验证的方法步骤
Apr 29 Javascript
layui实现数据表格点击搜索功能
Mar 26 Javascript
vue2路由方式--嵌套路由实现方法分析
Mar 06 Javascript
uploader秒传图片到服务器完整代码
Apr 22 #Javascript
Node.js中看JavaScript的引用
Apr 22 #Javascript
详解Angular中的自定义服务Service、Provider以及Factory
Apr 22 #Javascript
Ionic2调用本地SQlite实例
Apr 22 #Javascript
ionic+AngularJs实现获取验证码倒计时按钮
Apr 22 #Javascript
移动端使用localResizeIMG4压缩图片
Apr 22 #Javascript
使用Xcache缓存器加速PHP网站的配置方法
Apr 22 #Javascript
You might like
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
Yii框架form表单用法实例
2014/12/04 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
AngularJs directive详解及示例代码
2016/09/01 Javascript
JS实现图片垂直居中显示小结
2016/12/13 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
vue实现树状表格效果
2020/12/29 Vue.js
haskell实现多线程服务器实例代码
2013/11/26 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
python xlsxwriter模块的使用
2020/12/24 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
写给学生的新学期寄语
2014/01/18 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
2014年高考决心书
2014/03/11 职场文书
食堂标语大全
2014/06/11 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
读后感作文评语
2014/12/25 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
汉字听写大会观后感
2015/06/12 职场文书
解除合同协议书范本
2016/03/21 职场文书