一篇搞懂原型鏈 深刻講解 prototype __proto__

看過構造函數和原型鏈的不少文章,要麼直接講的比較突兀,不適合新手看,要麼只是講了一部分,今天我來作個了斷,梳理一下本身的理解,還請各路大神不吝賜教。 (文中部分推論僅爲我的觀點,但願不會把誰誰帶進小黑溝裏)數組

一 無極生太極,太極生兩儀,兩儀生四象,四象生八卦,八卦演萬物

萬物皆對象,對象從何而來?函數

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

clipboard.png

objTom.__proto__ 指向 fn.prototypespa

fn.prototype.__proto__ 指向 Object.prototypeprototype

Object.prototype.__proto__ 指向 nullcode

這是最多見的原型鏈對象

三 人過留名 雁過留聲

objTom 的詠春拳了得,可是如何代表本身是師出正派 user 呢? 經過constructorip

clipboard.png

也就是說 斷定一個對象是哪一個門派有兩條,一功夫正宗 二功夫師出何門。原型鏈

var objJohn = {}
objJohn.__proto__ = user.prototype
objJohn.constructor = user

通過兩步 objJohn 正式成爲詠春弟子,固然,學了功夫背叛師門的也是有的。
師父的功夫哪裏來的呢?固然是本身悟出來的。
clipboard.png原型

四 創始之初 皆爲混沌

user雖然是函數,但也是對象,是由 Function 建立。可是Function這種原始天尊又由何而來?

clipboard.png

Function 建立了本身,自身的prototype __proto__都是function類型。儘管本身給本身用泥巴捏身體,可是這個泥巴(Function.prototype 函數)從何而來呢?

clipboard.png

雖然 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 構造函數從哪裏來的呢

clipboard.png

總算能夠出一口氣了。上圖咱們能夠看到。
1 Object 函數仍是 原始天尊 Function 生產出來的。
2 Object.prototype 咱們的混沌之靈來自 null

因此小小的更新下結論,這個不是雞和雞蛋的問題,是從無到有,從簡單到複雜的過程。

無 -> 混沌之靈 -> 原始天尊 -> 構造函數 -> 普通對象
null -> Object.prototype -> Function -> Object user等 -> objTom

盜圖一張 若有侵權請聯繫 我會盡快刪除

clipboard.png

終於看完了,我也終於寫完了,表述可還清楚?!看懂了?!看懂趕忙點個贊,累屎我了。

加個雞蛋 Array.prototype 你知道是什麼類型麼? 數組,沒錯咱們目前起碼見到了三種類型的prototype了。
Object.prototype.toString.call(Array.prototype) // "[object Array]"

相關文章
相關標籤/搜索