當我們建立乙個物件時 let obj = ,我們可以發現能使用很多種函式,但是我們明明沒有定義過它們,對於這種情況你是否有過疑惑?
當我們在瀏覽器中列印 obj 時你會發現,在 obj 上居然還有乙個proto屬性,那麼看來之前的疑問就和這個屬性有關係了。
其實每個 js 物件都有proto屬性,這個屬性指向了原型。接下來讓我們再看看proto裡面有什麼吧。
看到這裡你應該明白了,原型也是乙個物件,並且這個物件中包含了很多函式,所以我們可以得出乙個結論:對於 obj 來說,可以通過proto找到乙個原型物件,在該物件中定義了很多函式讓我們來使用。
在上面的圖中我們還可以發現乙個 constructor 屬性,也就是建構函式
開啟 constructor 屬性我們又可以發現其中還有乙個 prototype 屬性,並且這個屬性對應的值和先前我們在proto中看到的一模一樣。所以我們又可以得出乙個結論:原型的 constructor 屬性指向建構函式,建構函式又通過 prototype 屬性指回原型,但是並不是所有函式都具有這個屬性,function.prototype.bind() 就沒有這個屬性。
其實原型就是那麼簡單,接下來我們再來看一張圖,相信這張圖能讓你徹底明白原型和原型鏈
看完這張圖,我再來解釋下什麼是原型鏈吧。其實原型鏈就是多個物件通過proto的方式連線了起來。 obj 可以訪問到 valueof 函式,是因為 obj 通過原型鏈找到了 valueof 函式。
對於這一知識點,總結起來就是以下幾點:
object 是所有物件的爸爸,所有物件都可以通過proto找到它
function 是所有函式的爸爸,所有函式都可以通過proto找到它
函式的 prototype 是乙個物件
物件的proto屬性指向原型,proto將物件和原型連線起來組成了原型鏈
原型 和 原型鏈
每乙個js物件 null除外 都和另乙個物件相關聯。另乙個 物件就是我們熟知的原型,每乙個物件都從原型繼承屬性。所有通過物件直接量建立的物件都具有同乙個原型物件,並可以通過js object.prototype 獲得對原型物件的引用。通過關鍵字new和構造函式呼叫建立的物件的原型就是建構函式的 pr...
原型和原型鏈
原型鏈 例項物件與原型之間的連線,叫做原型鏈 function human human.prototype.age 22 var a new human console.log a.age 這裡的age掛載到了human的原型上面了。其實原型就是乙個物件。a為什麼能找到原型上面的物件呢?這裡例項物件...
原型和原型鏈
建構函式 function foo name age function 其實是 var a new object 的語法糖 var a 其實是 var a new array 的語法糖 function foo 其實是 var foo new function 的語法糖 new乙個物件的過程 建立乙...