JS的原型鏈,須要深入的研究才能搞懂。不要糾結細節吧。實在不行就按這個死背住,慢慢就理解了。總之吧就是一句話萬物皆對象。函數
結合這個圖示仔細理解吧。在你搞懂後你會發現。很嗨很刺激!spa
下面是必須記住的點。基礎知識不用說了吧。prototype
對象都是經過函數(即構造函數)建立的。
函數也是一個對象,即屬性的集合,因此也能夠對函數進行自定義屬性。對象
每一個函數默認的有一個prototype屬性。
這個prototype的屬性值是一個對象,默認的只有一個construct屬性指向函數自己。圖片
每一個對象都有一個隱藏的屬性——「__proto__」,這個屬性引用了建立這個對象的函數的prototype。即:fn.__proto__ === Fn.prototype
這裏的"__proto__"成爲「隱式原型」。原型鏈
對象的construct屬性指向構造函數。而構造函數的construct屬性指向自身。原型
訪問一個對象的屬性時,先在基本屬性中查找,若是沒有,再沿着__proto__這條鏈向上找,這就是原型鏈。這個對象的__proto__等於這個對象構造方法的prototype。這個對象的構造函數的prototype是一個對象。 這個對象是被Object()建立出來的。(Object()是JS內部定義好的。) 因此它的__proto__就等於Object.prototype。Object.prototype等於null。到此就是原型鏈的終結。it
而後呢還有一個點。io
函數能夠是一個普通函數也能夠做爲構造函數去建立對象。 當這個時候構造函數就和Object()函數是一個做用:做爲構造函數去生成對象。
普通構造函數和Object同樣的 他既是函數也是對象。他的__proto__指向於Function.prototype。這也是JS內部定義好的。Function.__proto__指向Function.prototype有點雞生蛋蛋生雞的意思(Function是被本身建立的)。這裏是一個循環引用。 Function.prototype也是一個對象,他的__proto__指向於Object.prototype。Object.prototype等於null。走到原型鏈的終結。class
以上就是我對JS原型鏈的理解,有什麼錯誤的地方但願你們指出。