換個角度看原型鏈

散漫的求道者發表於2019-04-15

起因

從初學到現在,我發現關於原型鏈的解釋都停留在原型鏈本身,從一個事物的多方面去了解一個事物,是非常有益的,所以今天突然就有靈感(其實是壓制不住自己的思維),藉助連結串列和javascript類背後的原型委託思想來解釋原型。

原型鏈的本質----> 特殊連結串列

普通連結串列

換個角度看原型鏈

原型連結串列(以""為例)

就像我們一般設定的連結串列中的next指標,javascript為了我們提供了內建的next指標__proto__,對於原型連結串列,由於不想普通單向連結串列項一樣都是同一個類派生的物件,在這裡我稱原型鏈為特殊連結串列

換個角度看原型鏈

類模擬背後的思想-委託

這裡提一下,JavaScript本身並沒有提供“繼承”,繼承的本意是複製,而javascript本身實現所謂的繼承,是將屬性進行代理得到的,而代理的意思,就是我在你身上沒有找到屬性,那麼就去與你關聯的上級**__proto__連結的下一個節點**去找這個屬性

prototype只是一個“特殊的節點型別”

原型鏈的本質是為了實現屬性的[[GET]]操作,prototype我認為是為了在使用建構函式建立物件時,自動設定連結串列中的next屬性,即將物件的__proto__連結到建構函式的prototype屬性的語法糖

一個不使用prototype實現屬性委託的例子
let a = {
  a: 1
}
let b = {
  b: 2
}
let c = {
  cj: "cc"
}
Object.setPrototypeOf(a,b) // 等同於a.__proto__ = b 
Object.setPrototypeOf(b, c) // 等同於 b.__proto__ = c
console.log(a.cj)
console.log(a.b)
console.log(a.a)
複製程式碼

這裡無需藉助建構函式的prototype屬性,一樣可以實現屬性的委託。

使用prototype作為特殊節點的好處
  1. 使用建構函式時,能夠自動將生成物件的__proto__指向構造器的prototype
  2. 不需要額外再建立節點,可以在利用現有的prototype屬性指向的物件

一句話描述原型鏈

一條能夠讓在內部實現屬性代理的委託連結串列

總結

原型鏈是一條是物件自身作為頭節點,內建的__proto__作為next指標,構造器的prototype作為後續節點的特殊單連結串列

“鼓勵”

現在不像以前大佬們開荒,全靠自學,很多大佬們都出了自己的部落格,寫的很好,我希望能夠沉進去技術裡面,所以不時會埋頭寫點文章,希望能夠得到大家的小星星,以資鼓勵,當然新人寫的東西,無論是排版還是嚴謹方面都有待提高,更多希望大家提出自己的意見,幫助我這個萌新學習。

相關文章