不要紧, 面试的时候总会问如何在Vue的实例上挂载一个方法/属性, 也就是Vue.prototype
的小技巧, 可是忽然有人问他俩有啥关系还真是新鲜. javascript
Vue.prototype.$xx
是用法的, 可是没有说明Vue.use的用法以及
Vue.prototype.$xx
为何就能在组件内
this.$xx
这么调用, 因此下面我就细细的说下.
看完本文, 能掌握如何定义一个Vue插件, 以及Vue.prototype.$xx的原理.html
下面是饿了么UI的引入代码, 你们对这段应该很熟悉了.前端
import Vue from 'vue'
import Element from 'element-ui'
Vue.use(Element)
复制代码
接下来, 咱们在看下这个Element
是什么vue
Element
是个对象, 上面有
version
等字段, 其中还有一个
install
,他是本文的主角,
Vue.use
就是要运行这个
install
对应的函数.
写一段最少的代码演示如何用Vue.use初始化插件:java
// 插件
const plugin = {
install(){
document.write('我是install内的代码')
}
}
// 初始化插件
Vue.use(plugin); // 页面显示"我是install内的代码"
复制代码
在codepen上看预览 若是想知道插件的具体实现, 请看 cn.vuejs.org/v2/guide/pl…git
Element
.install
字段.install
字段是一个函数.Vue.use()
.Vue.use()
调用必须在new Vue
以前.好了, 回过头咱们再看眼上面的图片, 是否是发现了熟悉的代码:github
Vue.prototype.$loading = Loading.service;
Vue.prototype.$msgbox = MessageBox;
Vue.prototype.$alert = MessageBox.alert;
...
复制代码
Vue.prototype
的用法我相信你们都会用, 我作过调查, 我就不啰嗦了, 可是我发现你们好像不知道"因此然".面试
为何初始化的时候运行了Vue.prototype.$alert
, 而后就能够在任意组件内部运行this.$alert()
了呢? 首先要了解构造函数, 实例, 原型(prototype)这3个概念.element-ui
这3个概念有点老生常谈了, 百度一搜不少解释, 我先举个例子来和Vue类比你就明白他俩了.微信
首先我写个假的Vue
咱们叫他AVue
, 恩, 他是个"赝品", "A货", 接下来跟我一步一步走:
这里咱们只模拟下methods
功能.
function AVue({methods}){
for(let key in methods){
this[key] = methods[key];
}
}
复制代码
$alert
AVue.prototype.$alert = ()=>{document.write('我是个赝品!')}
复制代码
实例化Vue的时候咱们知道, 咱们会传入一个对象, 对象里面有data/methods等, 个人AVue同样, 下面咱们让AVue也学Vue那样实例化:
// 我只山寨了methods, 因此只能学methods喽
const av = new AVue({
methods: {
say(){
this.$alert();
}
}
});
// 调用一下say
av.say(); // 我是个赝品!
复制代码
好了, 运行到这里, 我想你应该看明白了吧, 以前你们写的Vue.prototype.$xx
其实只不过是js中函数原型的特性罢了: 函数原型上的属性/方法, 在函数实例化后, 能够在任意实例上读取, 要不你也作个"赝品"试下.
vue让你们知道了defineProperty, 咱们本身也能够用下他, 好比让Vue.prototype变成不可写的, 防止被覆盖.
Object.defineProperty(Vue.prototype, '$alert', {
writable: false,
value(){
console.log('我是行货!')
}
});
复制代码
建议你们能够随便写一个vue的插件练手, 好比个人练手项目就是他:
:lollipop:命令式调用vue组件 github.com/any86/vue-c…
感谢你们的阅读, 若有疑问能够加群🚀, 群里有好多有趣的前端的小伙伴, 让咱们共同窗习成长吧!
也可加我微信, 我拉你进入微信群(因为腾讯对微信群的100人限制, 超过100人后必须由我拉进去)