看過構造函數和原型鏈的不少文章,要麼直接講的比較突兀,不適合新手看,要麼只是講了一部分,今天我來作個了斷,梳理一下本身的理解,還請各路大神不吝賜教。 (文中部分推論僅爲我的觀點,但願不會把誰誰帶進小黑溝裏)數組
萬物皆對象,對象從何而來?函數
var a = {}; var b = new Object(); var c = Object(); var d = new fn(); var ga = Object.create(null); var gb = Object.create({}); var gc = Object.create(d); // 其實都是實例化構造函數 function user(){ this.name = 'tom'; } fn.prototype.age = 18; var objTom = new user();
構造函數有 .prototype .__proto__ 對象有 .__proto__ (prototype 又是對象)this
objTom.__proto__ 指向 fn.prototypespa
fn.prototype.__proto__ 指向 Object.prototypeprototype
Object.prototype.__proto__ 指向 nullcode
這是最多見的原型鏈對象
objTom 的詠春拳了得,可是如何代表本身是師出正派 user 呢? 經過constructorip
也就是說 斷定一個對象是哪一個門派有兩條,一功夫正宗 二功夫師出何門。原型鏈
var objJohn = {} objJohn.__proto__ = user.prototype objJohn.constructor = user
通過兩步 objJohn 正式成爲詠春弟子,固然,學了功夫背叛師門的也是有的。
師父的功夫哪裏來的呢?固然是本身悟出來的。
原型
user雖然是函數,但也是對象,是由 Function 建立。可是Function這種原始天尊又由何而來?
Function 建立了本身,自身的prototype __proto__都是function類型。儘管本身給本身用泥巴捏身體,可是這個泥巴(Function.prototype 函數)從何而來呢?
雖然 Function 能建立本身 可是仍是依賴於 Object和Object.prototype(咱們叫他混沌之靈吧)。
Object 用 Object.prototype 建立了 Function.prototype 函數(對象) (由於指向他的__proto__)
Function 用 Function.prototype 建立了 Function 函數(對象) (由於指向他的__proto__)
Function 用 Function.prototype 建立了 user 函數(對象) (由於指向他的__proto__)
user 用 user.prototype 建立了 objTom 對象 (由於指向他的__proto__)
問題又來了,Object 構造函數從哪裏來的呢
總算能夠出一口氣了。上圖咱們能夠看到。
1 Object 函數仍是 原始天尊 Function 生產出來的。
2 Object.prototype 咱們的混沌之靈來自 null
因此小小的更新下結論,這個不是雞和雞蛋的問題,是從無到有,從簡單到複雜的過程。
無 -> 混沌之靈 -> 原始天尊 -> 構造函數 -> 普通對象
null -> Object.prototype -> Function -> Object user等 -> objTom
盜圖一張 若有侵權請聯繫 我會盡快刪除
終於看完了,我也終於寫完了,表述可還清楚?!看懂了?!看懂趕忙點個贊,累屎我了。
加個雞蛋 Array.prototype 你知道是什麼類型麼? 數組,沒錯咱們目前起碼見到了三種類型的prototype了。 Object.prototype.toString.call(Array.prototype) // "[object Array]"