Vue.use()的实现

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中,表示插件已成功注册

你可能感兴趣的:(js)