## 創建一個 Vue 實例
每個 Vue 應用都是通過用 `Vue` 函數創建一個新的 **Vue 實例**開始的:
```js
var vm = new Vue({
// 選項
})
```
雖然沒有完全遵循 [MVVM 模型](https://zh.wikipedia.org/wiki/MVVM),但是 Vue 的設計也受到了它的啟發。因此在文檔中經常會使用 `vm` (ViewModel 的縮寫) 這個變量名表示 Vue 實例。
當創建一個 Vue 實例時,你可以傳入一個**選項對象**。這篇教程主要描述的就是如何使用這些選項來創建你想要的行為。作為參考,你也可以在 [API 文檔](../api/#選項-數據) 中瀏覽完整的選項列表。
一個 Vue 應用由一個通過 `new Vue` 創建的**根 Vue 實例**,以及可選的嵌套的、可復用的組件樹組成。舉個例子,一個 todo 應用的組件樹可以是這樣的:
```
根實例
└─ TodoList
├─ TodoItem
│ ├─ DeleteTodoButton
│ └─ EditTodoButton
└─ TodoListFooter
├─ ClearTodosButton
└─ TodoListStatistics
```
我們會在稍后的[組件系統](components.html)章節具體展開。不過現在,你只需要明白所有的 Vue 組件都是 Vue 實例,并且接受相同的選項對象 (一些根實例特有的選項除外)。
## 數據與方法
當一個 Vue 實例被創建時,它向 Vue 的**響應式系統**中加入了其 `data` 對象中能找到的所有的屬性。當這些屬性的值發生改變時,視圖將會產生“響應”,即匹配更新為新的值。
```js
// 我們的數據對象
var data = { a: 1 }
// 該對象被加入到一個 Vue 實例中
var vm = new Vue({
data: data
})
// 獲得這個實例上的屬性
// 返回源數據中對應的字段
vm.a == data.a // => true
// 設置屬性也會影響到原始數據
vm.a = 2
data.a // => 2
// ……反之亦然
data.a = 3
vm.a // => 3
```
當這些數據改變時,視圖會進行重渲染。值得注意的是只有當實例被創建時 `data` 中存在的屬性才是**響應式**的。也就是說如果你添加一個新的屬性,比如:
```js
vm.b = 'hi'
```
那么對 `b` 的改動將不會觸發任何視圖的更新。如果你知道你會在晚些時候需要一個屬性,但是一開始它為空或不存在,那么你僅需要設置一些初始值。比如:
```js
data: {
newTodoText: '',
visitCount: 0,
hideCompletedTodos: false,
todos: [],
error: null
}
```
這里唯一的例外是使用 `Object.freeze()`,這會阻止修改現有的屬性,也意味著響應系統無法再*追蹤*變化。
```js
var obj = {
foo: 'bar'
}
Object.freeze(obj)
new Vue({
el: '#app',
data: obj
})
```
```html
<div id="app">
<p>{{ foo }}</p>
<!-- 這里的 `foo` 不會更新! -->
<button v-on:click="foo = 'baz'">Change it</button>
</div>
```
除了數據屬性,Vue 實例還暴露了一些有用的實例屬性與方法。它們都有前綴 `$`,以便與用戶定義的屬性區分開來。例如:
```js
var data = { a: 1 }
var vm = new Vue({
el: '#example',
data: data
})
vm.$data === data // => true
vm.$el === document.getElementById('example') // => true
// $watch 是一個實例方法
vm.$watch('a', function (newValue, oldValue) {
// 這個回調將在 `vm.a` 改變后調用
})
```
以后你可以在 [API 參考](../api/#實例屬性)中查閱到完整的實例屬性和方法的列表。
## 實例生命周期鉤子
每個 Vue 實例在被創建時都要經過一系列的初始化過程——例如,需要設置數據監聽、編譯模板、將實例掛載到 DOM 并在數據變化時更新 DOM 等。同時在這個過程中也會運行一些叫做**生命周期鉤子**的函數,這給了用戶在不同階段添加自己的代碼的機會。
比如 [`created`](../api/#created) 鉤子可以用來在一個實例被創建之后執行代碼:
```js
new Vue({
data: {
a: 1
},
created: function () {
// `this` 指向 vm 實例
console.log('a is: ' + this.a)
}
})
// => "a is: 1"
```
也有一些其它的鉤子,在實例生命周期的不同階段被調用,如 [`mounted`](../api/#mounted)、[`updated`](../api/#updated) 和 [`destroyed`](../api/#destroyed)。生命周期鉤子的 `this` 上下文指向調用它的 Vue 實例。
<p class="tip">不要在選項屬性或回調上使用[箭頭函數](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions),比如 `created: () => console.log(this.a)` 或 `vm.$watch('a', newValue => this.myMethod())`。因為箭頭函數是和父級上下文綁定在一起的,`this` 不會是如你所預期的 Vue 實例,經常導致 `Uncaught TypeError: Cannot read property of undefined` 或 `Uncaught TypeError: this.myMethod is not a function` 之類的錯誤。</p>
## 生命周期圖示
下圖展示了實例的生命周期。你不需要立馬弄明白所有的東西,不過隨著你的不斷學習和使用,它的參考價值會越來越高。

- 寫在前面
- 基礎
- 安裝
- 介紹
- Vue實例
- 模板語法
- 計算屬性和偵聽器
- Class 與 Style 綁定
- 條件渲染
- 列表渲染
- 事件處理
- 表單輸入綁定
- 組件基礎
- 深入了解組件
- 組件注冊
- Prop
- 自定義事件
- 插槽
- 動態組件 & 異步組件
- 處理邊界情況
- 過渡 & 動畫
- 進入/離開 & 列表過渡
- 狀態過渡
- 可復用性 & 組合
- 混入
- 自定義指令
- 渲染函數 & JSX
- 插件
- 過濾器
- 工具
- 生產環境部署
- 單文件組件
- 單元測試
- TypeScript 支持
- 規模化
- 路由
- 狀態管理
- 服務端渲染
- 內在
- 深入響應式原理
- 遷移
- 從 Vue 1.x 遷移
- 從 Vue Router 0.7.x 遷移
- 從 Vuex 0.6.x 遷移到 1.0
- 更多
- 對比其他框架
- 加入 Vue.js 社區
- 開發團隊