換個角度看原型鏈

原由

從初學到如今,我發現關於原型鏈的解釋都停留在原型鏈自己,從一個事物的多方面去了解一個事物,是很是有益的,因此今天忽然就有靈感(實際上是壓制不住本身的思惟),藉助鏈表和javascript類背後的原型委託思想來解釋原型。javascript

原型鏈的本質----> 特殊鏈表

普通鏈表

原型鏈表(以""爲例)

就像咱們通常設置的鏈表中的next指針,javascript爲了咱們提供了內置的next指針__proto__,對於原型鏈表,因爲不想普通單向鏈表項同樣都是同一個類派生的對象,在這裏我稱原型鏈爲特殊鏈表java

類模擬背後的思想-委託

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

prototype只是一個「特殊的節點類型」

原型鏈的本質是爲了實現屬性的[[GET]]操做,prototype我認爲是爲了在使用構造函數建立對象時,自動設置鏈表中的next屬性,即將對象的__proto__連接到構造函數的prototype屬性的語法糖github

一個不使用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做爲後續節點的特殊單鏈表ui

「鼓勵」

如今不像之前大佬們開荒,全靠自學,不少大佬們都出了本身的博客,寫的很好,我但願可以沉進去技術裏面,因此不時會埋頭寫點文章,但願可以獲得你們的小星星,以資鼓勵,固然新人寫的東西,不管是排版仍是嚴謹方面都有待提升,更多但願你們提出本身的意見,幫助我這個萌新學習。spa

相關文章
相關標籤/搜索