首先,明确一点,
- 不是为了vue写的插件(插件内要处理)不支持Vue.use()加载方式
- 非vue官方库不支持new Vue()方式
- 每一个vue组件都是Vue的实例,所以组件内this可以拿到Vue.prototype上添加的属性和方法。
可能网上说的比较概念化,其实主要是插件内源码编写的内容方式不一样,用Vue.use全局注册的插件,必须含有install方法,vue.use()通过bind()置换install()的this为vue实例环境;
我们来看Vue.use
方法内部是怎么实现的
Vue.use = function (plugin) {
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 {
plugin.apply(null, args);
}
plugin.installed = true;
return this;
};
其实也就是调用了这个install
方法而已。
关键在于这一句args.unshift(this)传入了Vue实例对象,,args.unshift(this),等同于[].unshift(Vue),即args = [Vue];
install方法传入的参数为args内数组元素,即install接受的第一个参数为Vue.
那假如有些插件不规范又或者不是按照vue规则设计(准确地说不是专门为VUE服务);里面没有install方法,那么就通过添加到vue原型链上的方式使用。