Vue经典面试题: Vue.use和Vue.prototype.$xx有血缘关系吗?

九路 等级 912 0 0

有关系吗?

没关系, 面试的时候总会问如何在Vue的实例上挂载一个方法/属性, 也就是Vue.prototype的小技巧, 但是突然有人问他俩有啥关系还真是新鲜.

Vue经典面试题: Vue.use和Vue.prototype.$xx有血缘关系吗?

image

我想应该是网上有文章写Vue.prototype.$xx是用法的, 但是没有说明Vue.use的用法以及Vue.prototype.$xx为什么就能在组件内this.$xx 这么调用, 所以下面我就细细的说下.

说能学会啥?

看完本文, 能掌握如何定义一个Vue插件, 以及Vue.prototype.$xx的原理.

Vue.use

用饿了么UI举例

下面是饿了么UI的引入代码, 大家对这段应该很熟悉了.

import Vue from 'vue'
import Element from 'element-ui'
Vue.use(Element) 

接下来, 我们在看下这个Element是什么

Vue经典面试题: Vue.use和Vue.prototype.$xx有血缘关系吗?

image

这里我们看到Element是个对象, 上面有version等字段, 其中还有一个install,他是本文的主角, Vue.use就是要运行这个install对应的函数.

最小结构

写一段最少的代码演示如何用Vue.use初始化插件:

// 插件
const plugin = {
  install(){
    document.write('我是install内的代码')
  }
}

// 初始化插件
Vue.use(plugin); // 页面显示"我是install内的代码" 

在codepen上看预览

如果想知道插件的具体实现, 请看 https://cn.vuejs.org/v2/guide/plugins.html

总结

  1. Vue的插件是一个对象, 就像Element.
  2. 插件对象必须有install字段.
  3. install字段是一个函数.
  4. 初始化插件对象需要通过Vue.use().

扩展学习

  1. Vue.use()调用必须在new Vue之前.
  2. 同一个插件多次使用Vue.use()也只会被运行一次.

Vue.prototype.$xx

好了, 回过头我们再看眼上面的图片, 是不是发现了熟悉的代码:

Vue.prototype.$loading = Loading.service;
Vue.prototype.$msgbox = MessageBox;
Vue.prototype.$alert = MessageBox.alert;
... 

Vue.prototype 的用法我相信大家都会用, 我做过调查, 我就不啰嗦了, 但是我发现大家好像不知道"所以然".

所以然

为什么初始化的时候运行了Vue.prototype.$alert, 然后就可以在任意组件内部运行this.$alert()了呢? 首先要了解构造函数, 实例, 原型(prototype)这3个概念.

构造函数, 实例, 原型(prototype)

这3个概念有点老生常谈了, 百度一搜很多解释, 我先举个例子来和Vue类比你就明白他俩了.

首先我写个假的Vue我们叫他AVue, 恩, 他是个"赝品", "A货", 接下来跟我一步一步走:

1. AVue是个构造函数

这里我们只模拟下methods功能.

function AVue({methods}){
    for(let key in methods){
        this[key] = methods[key];
    }
} 

2. 给AVue的原型上放个$alert

AVue.prototype.$alert = ()=>{document.write('我是个赝品!')} 

3. 实例化AVue

实例化Vue的时候我们知道, 我们会传入一个对象, 对象里面有data/methods等, 我的AVue一样, 下面我们让AVue也学Vue那样实例化:

// 我只山寨了methods, 所以只能学methods喽
const av = new AVue({
    methods: {
        say(){
            this.$alert(); 
        }
    }
});

// 调用一下say
av.say(); // 我是个赝品! 

在codepen上预览

总结

好了, 运行到这里, 我想你应该看明白了吧, 之前大家写的Vue.prototype.$xx其实只不过是js中函数原型的特性罢了: 函数原型上的属性/方法, 在函数实例化后, 可以在任意实例上读取, 要不你也做个"赝品"试下.

扩展

vue让大家知道了defineProperty, 我们自己也可以用下他, 比如让Vue.prototype变成不可写的, 防止被覆盖.

Object.defineProperty(Vue.prototype, '$alert', {
    writable: false,
    value(){
        console.log('我是行货!')
    }
}); 

课后练习

建议大家可以随便写一个vue的插件练手, 比如我的练手项目就是他:

:lollipop:命令式调用vue组件
https://github.com/any86/vue-create-root

Vue经典面试题: Vue.use和Vue.prototype.$xx有血缘关系吗?

image

收藏
评论区

相关推荐

Vue经典面试题: Vue.use和Vue.prototype.$xx有血缘关系吗?
有关系吗? 没关系, 面试的时候总会问如何在Vue的实例上挂载一个方法/属性, 也就是Vue.prototype的小技巧, 但是突然有人问他俩有啥关系还真是新鲜. (https://imghelloworld.osscnbeijing.aliyuncs.com/8accd67b8a68646ac4d99fd7297e0fbc
基于Vue实现一个有点意思的拼拼乐小游戏
笔者去年曾写过一个类似的拼拼乐小游戏,技术栈采用自己的Xuery框架和原生javascript实现的,脚手架采用gulp来实现,为了满足对vue的需求,笔者再次使用vue生态将其重构,脚手架采用比较火的vuecli。 前言 为了加深大家对vue的了解和vue项目实战,笔者采用vue生态来重构此项目,方便大家学习和探索。技术栈如下: vuecli4
前端培训-Vue专题之Vue基础
简介特点:MVVM框架,双向绑定,数据驱动,单页面,组件化。 区别Vue 和 jQuery 的区别:不直接操作DOM,而是操作数据。案例:Hello World 你好,世界HTML代码:xml<h1msg</h1jQuery实现javascript$("h1").text("你好,世界");Vue 实现javascriptthis.msg '你好,世界'
10分钟阅读一篇关于Vue
![file](https://oscimg.oschina.net/oscnet/up-4f8ccb1755bb73c4ffe6a7ba91253ddc.jpg "file") Vue-cli Vue脚手架的基本用法,vue脚手架用于快速生成vue项目基础架构: 地址: https://cli.vuejs.org/zh/ 使用方式,安装3.x版本
Angular React Vue我应该选择什么?
2017 年比较 Angular、React、Vue 三剑客 ============================== 为 web 应用选择 JavaScript 开发框架是一件很费脑筋的事。现如今 [Angular](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Flink.juej
CodeMirror 在线代码编辑器
像百度编辑器插件部分、菜鸟教程示例等高德地图都在使用,这里也记录一下: CodeMirror是一个用于编辑器文本框textarea代码高亮javascript插件......vue 中使用 参见:https://www.npmjs.com/package/vue-codemirrorhttps://blog.csdn.net/oumaharuki/
Go在GitHub开源项目
后台管理系统 [https://github.com/flipped-aurora/gin-vue-admin](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fgithub.com%2Fflipped-aurora%2Fgin-vue-admin) Gin-vue-ad
React与Vue的相同与不同点
我们知道JavaScript是世界上最流行的语言之一,React和Vue是JS最流行的两个框架。所以要想前端的开发那么必须掌握好这两个框架。 那么这两个框架有什么不同呢? **React 和 Vue 相同之处,它们都有:** * 使用 Virtual DOM * 提供了响应式 (Reactive) 和组件化 (Composable) 的视图组件
React面试必问Fiber和Hooks,一次搞定
国内的前端领域,Vue 和 React 是最火的两个框架,要说岗位数量,Vue可能会更多一点。 但如果把公司范围缩小到大厂,或者把范围扩展到全球,那React无疑独占鳌头。 ![](https://oscimg.oschina.net/oscnet/ba57134c-6a7d-47d8-a317-7ad3976a1a77.jpg "2019年
Vue CLI 3搭建vue+vuex 最全分析
一、介绍 ==== Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统。有三个组件: **CLI**:`@vue/cli` 全局安装的 npm 包,提供了终端里的vue命令(如:vue create 、vue serve 、vue ui 等命令) **CLI 服务**:`@vue/cli-service`是一个开发环境依赖。构建于 [we
Vue 全家桶
vue全家桶。 使用过vue的程序员一般这样评价它,“vue.js兼具angular.js和react.js的优点”。Vue.js 是一个JavaScript MVVM(Model-View-ViewModel)库,用于渐近式构建用户界面。它以数据驱动和组件化思想构建,采用自底向上增量开发的设计思想。相比Angular.js,Vue.js API更加简洁;
Vue 全家桶、原理及优化简议
不少互联网公司都在使用vue技术栈,或称为vue全家桶。 使用过vue的程序员一般这样评价它,“vue.js兼具angular.js和react.js的优点”。Vue.js 是一个JavaScript MVVM(Model-View-ViewModel)库,用于渐近式构建用户界面。它以数据驱动和组件化思想构建,采用自底向上增量开发的设计
阿里巴巴前端练习生学习笔记
字符串引擎和Javascript引擎的区别:是否对于DOM进行全部改变? 相关资料链接• Wiki MVC • Wiki MVVM • Mustach • Handlebars • React • Angular • Vue • Bootstrap • Ant Design • Fusion Des
vue常见面试题
1. 有使用过vue吗?说说你对vue的理解?2. 说说你对SPA单页面的理解,它的优缺点分别是什么?如何实现SPA应用呢?3. 什么是双向绑定?原理是什么?4. 请描述下你对vue生命周期的理解?在created和mounted这两个生命周期中请求数据有什么区别呢?5. Vue组件之间的通信方式都有哪些?6. vshow和vif有什么区别?使用场景分别是什
Vue项目添加ElementUI
1\. 在上一篇,搭建环境,创建vue项目目录结构如下:编写工具,本人推荐:Visual Studio Code2\. 进入到项目文件夹,执行加载elementui组件命令:npm i elementui S 3\. 在main.js代码里添加对elementui的引用:import ElementUI from 'elementui' import 'el