## JavaScript 語言:通過一種叫做 原型(prototype)的方式來實現面向對象編程
### 1.萬物皆對象
> **在基于類的面向對象方式中,對象(object)依靠 類(class)來產生。而在基于原型的面向對象方式中,對象(object)則是依靠 構造器(constructor)利用 原型(prototype)構造出來的。舉個客觀世界的例子來說明二種方式認知的差異。例如工廠造一輛車,一方面,工人必須參照一張工程圖紙,設計規定這輛車應該如何制造。這里的工程圖紙就好比是語言中的 類 (class),而車就是按照這個 類(class)制造出來的;另一方面,工人和機器 ( 相當于 constructor) 利用各種零部件如發動機,輪胎,方向盤 ( 相當于 prototype 的各個屬性 ) 將汽車構造出來。**
* 對象是單個實物的抽象。
~~~
一本書、一輛汽車、一個人都可以是對象,一個數據庫、一張網頁、一個與遠程服務器的連接也可以是對象。當實物被抽象成對象,實物之間的關系就變成了對象之間的關系,從而就可以模擬現實情況,針對對象進行編程。
~~~
* 對象是一個容器,封裝了屬性(property)和方法(method)
~~~
屬性是對象的狀態,方法是對象的行為(完成某種任務)。比如,我們可以把動物抽象為animal對象,使用“屬性”記錄動物的顏色\種類,使用“方法”表示動物的某種行為(奔跑、捕獵、休息等等)。
~~~
### 2.面向對象第一步:生成對象
* 典型的面向對象編程語言(比如 C++ 和 Java),都有“類”(class)這個概念。所謂“類”就是對象的模板,對象就是“類”的實例
* 而Javascript在es6之前沒有類這個概念,Javascript使用構造函數來模擬Java中的類;
構造函數:eg:
~~~
var Person = function(name,age){
this.name = name;
this.age = age;
}
~~~
> 構造函數函數體內部使用了this關鍵字,代表了所要生成的對象實例。
> **生成對象時,必須使用new命令**
eg:
~~~
var pi= new Person("xiaopi",19)
~~~
> 調用對象的屬性
eg:
~~~
console.log(pi.name);//xiaopi
console.log(pi.age); //19
~~~
> **new命令的原理**
* 使用new命令時,它后面的函數依次執行下面的步驟。
1.創建一個對象實例
2.實例化對象的原型指向構造函數的原型對象
3.將這個對象賦值給構造函數的this