【译】Vue源码学习(一):Vue对象构造函数
本系列文章详细深入Vue.js的源代码,以此来说明JavaScript的基本概念,尝试将这些概念分解到JavaScript初学者可以理解的水平。有关本系列的一些后续的计划和轨迹的更多信息,请参阅此文章。有关本系列的文章更新进度的信息,请关注我的Tweeter。本系列的文章目录,请查看该链接。
Vue对象构造函数
Vue实例是深入了解Vue源代码的一个基本点。正如Vue官方文档所说那样,“每个Vue应用程序都是通过使用Vue函数创建一个新的Vue实例来开始的。”
在Vue的源码中,一个新的Vue实例是使用Vue对象的构造函数创建的。
function Vue (options) {
if (process.env.NODE_ENV !== 'production' &&
!(this instanceof Vue)
) {
warn('Vue is a constructor and should be called with the `new` keyword');
}
this._init(options);
}
一个对象的构造函数是创建其他对象的一个蓝本。对象构造函数按约定通常是以大写字母开头。
function Vue (options) {
[. . . .]
}
通过new关键字来调用一个对象构造函数。例如,你应该会按一下方式调用Vue构造函数:
var vm = new Vue({
// options
})
调用对象构造函数会返回一个新的对象,并且将this关键字指向为返回的对象。
Vue对象构造函数接收一个参数:options
function Vue (options) {
[. . . .]
}
Vue对象构造函数使用if语句测试当前环境不为生产环境
[....]
if (process.env.NODE_ENV !== 'production' &&
!(this instanceof Vue)
) {
warn('Vue is a constructor and should be called with the `new` keyword');
}
[....]
如果当前环境为生产环境,则&&短路逻辑为false,其余的表达式则不执行。
如果是在开发环境,对象构造函数会检查this是否不是Vue对象构造函数的实例。
[....]
if (process.env.NODE_ENV !== ‘production’ &&
!(this instanceof Vue)
) {
warn(‘Vue is a constructor and should be called with the `new` keyword’);
}
[....]
如果是在开发环境下并且this不是Vue对象构造函数的实例,则该对象构造函数调用warn函数并传入一个字符串作为一个参数,通知开发者使用new关键字将Vue作为构造函数来调用。
[....]
if (process.env.NODE_ENV !== ‘production’ &&
!(this instanceof Vue)
) {
warn(‘Vue is a constructor and should be called with the `new` keyword’);
}
[....]
我们将会在另一篇文章来介绍warn函数的实现细节。如果你认真细看,会注意到使用单引号和勾号传递给warn函数。
warn('Vue is a constructor and should be called with the `new` keyword');
在单引号中间使用勾号明显的好处是具有防止引用过早结束。
最后,Vue构造函数调用方法this._init 并且传入参数options
function Vue (options) {
[....]
this._init(options);
}
但等一下,_init方法在this对象中哪里定义的?正如我们所见,这个方法并没有定义在构造函数中。快速查找源码可以发现该._init在一个名为initMixin的单独函数中加到了Vue.prototype中。
我们下次再详细介绍initMixin。如果你喜欢这个系列,并想激励我继续努力,鼓励,跟随,回应或分享你的内心。
下一篇:initMixin函数
(END 2019/05/19)
原文链接
https://medium.com/@oneminutejs/a-deep-dive-in-the-vue-js-source-code-fd9638c05c05
【译】Vue源码学习(一):Vue对象构造函数的更多相关文章
- Vue源码学习二 ———— Vue原型对象包装
Vue原型对象的包装 在Vue官网直接通过 script 标签导入的 Vue包是 umd模块的形式.在使用前都通过 new Vue({}).记录一下 Vue构造函数的包装. 在 src/core/in ...
- Vue源码学习1——Vue构造函数
Vue源码学习1--Vue构造函数 这是我第一次正式阅读大型框架源码,刚开始的时候完全不知道该如何入手.Vue源码clone下来之后这么多文件夹,Vue的这么多方法和概念都在哪,完全没有头绪.现在也只 ...
- Vue源码学习三 ———— Vue构造函数包装
Vue源码学习二 是对Vue的原型对象的包装,最后从Vue的出生文件导出了 Vue这个构造函数 来到 src/core/index.js 代码是: import Vue from './instanc ...
- vue 源码学习三 vue中如何生成虚拟DOM
vm._render 生成虚拟dom 我们知道在挂载过程中, $mount 会调用 vm._update和vm._render 方法,vm._updata是负责把VNode渲染成真正的DOM,vm._ ...
- Vue源码学习一 ———— Vue项目目录
Vue 目录结构 可以在 github 上通过这款 Chrome 插件 octotree 查看Vue的文件目录.也可以克隆到本地.. Vue 是如何规划目录的 scripts ------------ ...
- 【Vue源码学习】依赖收集
前面我们学习了vue的响应式原理,我们知道了vue2底层是通过Object.defineProperty来实现数据响应式的,但是单有这个还不够,我们在data中定义的数据可能没有用于模版渲染,修改这些 ...
- Vue源码学习(一):调试环境搭建
最近开始学习Vue源码,第一步就是要把调试环境搭好,这个过程遇到小坑着实费了点功夫,在这里记下来 一.调试环境搭建过程 1.安装node.js,具体不展开 2.下载vue项目源码,git或svn等均可 ...
- 最新 Vue 源码学习笔记
最新 Vue 源码学习笔记 v2.x.x & v3.x.x 框架架构 核心算法 设计模式 编码风格 项目结构 为什么出现 解决了什么问题 有哪些应用场景 v2.x.x & v3.x.x ...
- Vue源码分析(二) : Vue实例挂载
Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...
- 【Vue源码学习】响应式原理探秘
最近准备开启Vue的源码学习,并且每一个Vue的重要知识点都会记录下来.我们知道Vue的核心理念是数据驱动视图,所有操作都只需要在数据层做处理,不必关心视图层的操作.这里先来学习Vue的响应式原理,V ...
随机推荐
- 代码格式化工具---indent工具
indent工具,可以把代码格式化成某种风格. 通过命令:rpm -qa | grep indent 查看是否安装了indent工具. 若没有,可使用命令sudo apt-get install ...
- P5590 【赛车游戏】
果然我还是太\(Naive\)了 首先有一些点/边其实是没有意义的,如果从1出发不能到该点或者从该点不能到n,这个点就可以不用管了.这个过程可以用正反两边\(dfs/bfs\)实现 然后删掉那些点之后 ...
- redis系列(四):切换RDB备份到AOF备份
1.准备环境 redis.conf服务端配置如下: daemonize yes port logfile /data//redis.log dir /data/ dbfilename dbmp.rdb ...
- std_msgs/String.msg
from std_msgs.msg import String http://docs.ros.org/api/std_msgs/html/msg/String.html
- archlinux安装nvidia-1050ti闭源驱动教程,亲测
link:https://blog.csdn.net/u014025444/article/details/91454059
- tecplot当中共用一个legend进行对比
原版视频下载地址链接: https://pan.baidu.com/s/1nvHa0kx 密码: q33e
- GIS地理处理工具案例教程-成本距离
GIS地理处理工具案例教程-成本距离 关键词:最短路径,成本路径,最佳路径,最优路径,路径分析,选线分析 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq ...
- python 设计模式之组合模式Composite Pattern
#引入一 文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件. 那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象. 这是一个树形结构 咱们生活工作中常用的一种结构 ...
- layui表格工具条,如何动态控制按钮的展示?
<script type="text/html" id="toolTpl"> {{# if(d.agrgrtsts == 'A'){ }} < ...
- ubuntu二进制包安装openresty
date: 2019-08-01 17:59:59 author: headsen chen # 导入我们的 GPG 密钥: wget -qO - https://openresty.org/pack ...