周一面試騰訊,面試的題很基礎,我自認為我的基礎還算不錯,但是…好像不是,看一下題吧
[].__proto__ === ?
[].__proto__.__proto__ === ?
[].__proto__.__proto__.__proto__ === ?
平時關注原型鏈關注的最多的就是函式,從來沒有想過陣列的原型鏈,看到了自己基礎的漏洞,
講原型鏈,就先從原型講起吧,以下內容就是我學習原型和原型鏈之后對這塊的理解,
如有錯誤,望指正~
1.原型
每個函式都會創建一個prototype屬性,這個屬性是一個物件,包含應該由特定參考型別的實體共享的屬性和方法,實際上,這個物件就是通過呼叫建構式創建的物件的原型, --《Javascript高級程式設計》
上面這句話可以得到三個資訊:
- 當我們創建一個函式的時候,就會隨之創建一個prototype屬性,這個屬性是一個js物件,(同時原型物件會獲得一個constructor的屬性,也是一個物件,指向相關的建構式本身,例如:Person.prototype.constructor === Person;)
- 原型的用處是:在原型上的方法和屬性可以被物件實體共享,比如說想給陣列定義一個方法,讓所有創建出來的陣列使用,那就可以在Array.prototype上定義;
- 物件實體的__proto__指向建構式的prototype,
到這我對原型就有了一個大概的了解,但是我還搞不懂一個問題,不是說“每個函式都會創建一個prototype屬性”嗎?Array是一個陣列物件,為什么它會有prototype屬性,
關于這個問題,我看了一下MDN,如圖:

Array 構造器會根據給定的元素創建一個 JavaScript 陣列,但是當僅有一個引數且為數字時除外,我們創建陣列的時候可以直接[]創建,也可以new Array()創建,
也就是說關于Array(),是我的理解錯誤,它并不是一個陣列,而是一個建構式,那么它有prototype屬性也就不難理解啦,
2.原型鏈
這里還是參考書上的話對原型鏈做出解釋吧,
重溫一下建構式、原型和實體的關系:每個建構式都有一個原型物件,原型有一個屬性指回建構式,而實體有一個內部指標指向原型,如果原型是另一個型別的實體呢?那就意味著這個原型本身有一個內部指標指向另一個原型,相應地另一個原型也有一個指標指向另一個建構式,這樣就在實體和原型之間構造了一條原型鏈,這就是原型鏈的基本構想,–《Javascript高級程式設計》
也就是說每個由建構式創建出來的實體物件都有一個隱式原型__proto__,指向建構式的原型prototype,并且這個原型也有一個__proto__屬性,就這樣一直向上,直到盡頭null,
到這里其實面試題的答案就已經出來了,我把以上總結為誰的__proto__指向實體物件的prtotype,其中的特殊情況是:Function的__proto__指向自身的prototype,
Object的prototype的__proto__指向null,
按照我的結論再看看面試題:
[].__proto__ === ?
[].__proto__.__proto__ === ?
[].__proto__.__proto__.__proto__ === ?
答案應該依次為Array.prototype,Object.prototype,null

第一個應該很好理解,[]是new Array()創建出來的,所以[].__proto__就指向了Array的原型prototype;
第二個由第一個可以轉換為Array.prototype.proto,在原型那塊說過prototype是一個js物件,那還可以轉換為Object.proto,最后就是Object.prototype
第三個就是Object.prototype.proto,也就是null,
當時不會這個題的時候我對面試官說不太了解陣列的原型,函式和物件的還可以,然后又給我出了個題,也不會,,,,
({}).__proto__ === ?
現在看很明顯了,就是Object.prototype,為啥用括號括起來呢,為了防止報錯,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/305227.html
標籤:其他
上一篇:制作js原生瀑布流插件
