不要緊, 面試的時候總會問如何在Vue的實例上掛載一個方法/屬性, 也就是Vue.prototype
的小技巧, 可是忽然有人問他倆有啥關係還真是新鮮.javascript
我想應該是網上有文章寫Vue.prototype.$xx
是用法的, 可是沒有說明Vue.use的用法以及Vue.prototype.$xx
爲何就能在組件內this.$xx
這麼調用, 因此下面我就細細的說下.html
看完本文, 能掌握如何定義一個Vue插件, 以及Vue.prototype.$xx的原理.vue
下面是餓了麼UI的引入代碼, 你們對這段應該很熟悉了.java
import Vue from 'vue' import Element from 'element-ui' Vue.use(Element)
接下來, 咱們在看下這個Element
是什麼git
這裏咱們看到Element
是個對象, 上面有version
等字段, 其中還有一個install
,他是本文的主角, Vue.use
就是要運行這個install
對應的函數.github
寫一段最少的代碼演示如何用Vue.use初始化插件:面試
// 插件 const plugin = { install(){ document.write('我是install內的代碼') } } // 初始化插件 Vue.use(plugin); // 頁面顯示"我是install內的代碼"
在codepen上看預覽element-ui
若是想知道插件的具體實現, 請看 https://cn.vuejs.org/v2/guide...ide
Element
.install
字段.install
字段是一個函數.Vue.use()
.Vue.use()
調用必須在new Vue
以前.好了, 回過頭咱們再看眼上面的圖片, 是否是發現了熟悉的代碼:函數
Vue.prototype.$loading = Loading.service; Vue.prototype.$msgbox = MessageBox; Vue.prototype.$alert = MessageBox.alert; ...
Vue.prototype
的用法我相信你們都會用, 我作過調查, 我就不囉嗦了, 可是我發現你們好像不知道"因此然".
爲何初始化的時候運行了Vue.prototype.$alert
, 而後就能夠在任意組件內部運行this.$alert()
了呢? 首先要了解構造函數, 實例, 原型(prototype)這3個概念.
這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的插件練手, 好比個人練手項目就是他:
命令式調用vue組件
https://github.com/any86/vue-...