凡是對象就有原型, 那麼原型又是對象, 所以凡是給定義一個對象, 那麼就能夠找到他的原型, 原型還有原型. 那麼如此下去, 就構成一個對象的序列. 稱該結構爲原型鏈.瀏覽器
問題:app
凡是使用構造函數建立出對象, 而且沒有利用賦值的方式修改原型, 就說該對象保留默認的原型鏈.dom
默認原型鏈結構是什麼樣子呢?函數
function Person() {} var p = new Person(); // p 具備默認的原型鏈
function Person() {} var p = new Person(); // p 具備默認的原型鏈
默認的原型鏈結構就是:spa
當前對象 -> 構造函數.prototype -> Object.prototype -> nullprototype
在實現繼承的時候, 有時會利用替換原型鏈結構的方式實現原型繼承, 那麼原型鏈結構就會發生改變code
function ItcastCollection () {} ItcastCollection.prototype = []; var arr = new ItcastCollection(); // arr -> [] -> Array.prototype -> Object.prototype -> null // var arr = new Array();
所謂的原型式繼承就是利用修改原型鏈的結構( 增長一個節點, 刪除一個節點, 修改節點中的成員 ), 來使得實例對象能夠使用整條鏈中的全部成員.對象
這裏的使用規則必須知足屬性搜索原則blog
說明: 函數中也有 __proto__
屬性. 注意, 暫時不考慮函數的該屬性繼承
function Person () {} var p = new Person();
function Person () {} var p = new Person();
練習:
在 js 中, 全部的對象字面量在解析之後, 就是一個具體的對象了. 那麼能夠理解爲 調用的 對應的構造方法.
{}
, 就至關於 new Object()
[]
, 就至關於 new Array()
/./
, 就至關於 new RegExp( '.' )
注意: 在底層理論執行的過程當中, 是否有調用構造函數, 不必定. 和瀏覽器的版本有關.
Object.prototype
對應的構造函數練習, 繪製原型鏈結構
var o = { appendTo: function ( dom ) { } }; function DivTag() {} DivTag.prototype = o; var div = new DivTag(); // div -> DivTag.prototype( 就是 o ) -> Object.prototype -> null