## 原型鏈
**3.1 原型**
每一個JavaScript對象(null除外)都和另一個對象相關聯,也可以說,繼承另一個對象。另一個對象就是我們熟知的“原型”(`prototype`),每一個對象都從原型繼承屬性。只有null除外,它沒有自己的原型對象。
我們可以通過`__proto__`(首尾都是雙下劃線)來獲取實例的原型對象。
注意:`__proto__`連接的是實例與構造函數的原型對象之間,而不是實例與構造函數之間。
所有通過對象直接量創建的對象都具有同一個原型對象,并可以通過JavaScript代碼`Object.prototype`獲得對原型對象的引用。
通過關鍵字new和構造函數調用創建的對象的原型就是構造函數的`prototype`屬性的值。比如:通過new Object()創建的對象繼承自Object.prototype;通過new Array()創建的對象的原型就是Array.prototype。
沒有原型的對象為數不多,`Object.prototype`就是其中之一,它不繼承任何屬性。
所有的內置構造函數都具有一個繼承自`Object.prototype`的原型。
**3.1 原型鏈**
在JavaScript中,原型鏈是實現繼承的主要方式。
原型鏈的基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。
可用`__proto__`屬性來獲取或設置對象的原型。
每個構造函數都有一個原型對象(prototype),原型對象本身也是對象,所以它也有自己的原型,而它本身的原型對象也有自己的原型,這樣層層遞進,就形成了一條鏈,這個鏈就是**原型鏈**。
JavaScript引擎在訪問對象的屬性時,會先在對象本身中查找,如果沒有找到,則會去原型鏈中查找,如果找到,則返回值,如果整個原型鏈中都沒有找到這個屬性,則返回undefined。
```
var person = {
name: 'human'
};
var person1 = {
name: 'tg',
__proto__: person
};
var person2 = {
__proto__: person
};
console.log(person1.name); // "tg"
console.log(person2.name); // "human"
console.log(person1.id); // undefined
```
從上面例子的運行結果,我們也可以看出原型鏈的運行機制:從對象本身出發,沿著`__proto__`查找,直到找到屬性名稱相同的值(沒有找到,則返回undefined)。
所有對象都繼承自`Ojbect`,而這個繼承也是通過原型鏈實現的。所有函數的默認原型都是Object的實例,因此默認的原型都會包含一個內部指針,指向`Object.prototype`。而`Object.prototype`的`__proto__`的屬性值為null,標志著原型鏈的結束。
**3.2 原型和實例**
有兩種方式來確定原型和實例之間的關系:
- 使用`instanceof`操作符
```
function Person(){}
var person = new Person();
console.log(person instanceof Object); // true
console.log(person instanceof Person); // true
```
- 使用`isPrototypeOf()`方法。
```
console.log(Object.prototype.isPrototypeOf(person)); // true
console.log(Person.prototype.isPrototypeOf(person)); // true
```
- 前言
- JavaScript簡介
- 基本概念
- 語法
- 數據類型
- 運算符
- 表達式
- 語句
- 對象
- 數組
- 函數
- 引用類型(對象)
- Object對象
- Array對象
- Date對象
- RegExp對象
- 基本包裝類型(Boolean、Number、String)
- 單體內置對象(Global、Math)
- console對象
- DOM
- DOM-屬性和CSS
- BOM
- Event 事件
- 正則表達式
- JSON
- AJAX
- 表單和富文本編輯器
- 表單
- 富文本編輯器
- canvas
- 離線應用
- 客戶端存儲(Cookie、Storage、IndexedDB)
- HTML5 API
- Video/Audio
- Geolocation API
- requestAnimationFrame
- File API
- FullScreen API
- IndexedDB
- 檢測設備方向
- Blob
- vibrate
- Luminosity API
- WebRTC
- Page Visibility API
- Performance API
- Web Speech
- Notification
- 面向對象的程序設計
- 概述
- this關鍵字
- 原型鏈
- 作用域
- 常用API合集
- SVG
- 錯誤處理機制
- JavaScript開發技巧合集
- 編程風格
- 垃圾回收機制