Vue.use(插件名)用于引入插件
打个断点看看它的实现
function initUse (Vue) {
Vue.use = function (plugin) {
var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
if (installedPlugins.indexOf(plugin) > -1) {
return this
}
// 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);
}
installedPlugins.push(plugin);
return this
};
}
首先,他会从Vue这个构造函数中寻找installedPlugins,若找不到,则
初始化为一个数组
然后在这个数组中判断是否有传进来的plugin这个插件,如果有则直接返回,如果没有则继续执行
然后到这一步,用toArray方法将arguments类数组转化为数组并剔除它的第一项(就是去除plugin这个参数,因为调用plugin.install的时候不需要这个参数),然后通过unshift()在数组首部添加this,也就是Vue对象。
接着我们进入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
}
这里返回的ret就是arguments从它下标1开始的数组
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args);
} else if (typeof plugin === 'function') {
plugin.apply(null, args);
}
installedPlugins.push(plugin);
return this
接着对plugin是一个函数还是对象进行判断
如果我们传入的插件是对象,那就调用插件的install方法并通过apply()方法将install方法改变this的指向为plugin。
若传入的插件是函数,则apply改变this指向为null即可
最后把插件push到installedPlugins中,表示插件已成功注册