這篇部落格隻是用來記錄自己所學的知識。
說到繼承,應該先提一下原型跟原型鍊。
那麼什麼是原型,我自己個人的了解是原型是一個對象,是一個當我們一行代碼都不寫就已經存在的那些對象,而且這些對象中包含的屬性可以被其constructor屬性指向的構造函數的所有執行個體共享。
比如我們在控制台輸入Object.prototype,Array.prototype,Function.prototype等,回車的時候我們就能夠看到結果裡有很多東西。
如下圖:
每個原型對象裡面都會有一個constructor屬性,它表明這個原型對象所在的構造函數是誰。
那麼我們為什麼需要原型對象呢?原因其實很簡單,比如我們寫了一個構造函數如下
function Person(name, age) {
this.name = name
this.age = age
this.sayName = function() {
console.log(this.name)
}
}
當我們每次new一個Person執行個體的時候,我們都必須給這個sayName方法配置設定記憶體空間,由于這個方法隻是列印名字而已,我們當然也就覺得沒必要這樣子每次都配置設定内從空間,是以我們可以将這個sayName方法寫到其原型對象中。
Person.prototype.sayName = function() {
console.log(this.name)
}
通過這樣的方式,sayName這個方法就隻需要配置設定一次記憶體空間即可,而且這個sayName方法可以被所有的Person執行個體共享,提高了方法的可複用性。
那麼原型鍊又是什麼呢。我們知道一個執行個體被new出來的時候,其實經曆了這樣的一個過程。
第一步: 建立一個空對象
第二步: 将這個對象連結到其構造函數的原型對象上,也就是這個執行個體會有一個__proto__指針,指向構造函數的原型對象
第三步: 将這個對象綁定到this上
第四步: 傳回這個對象
我們主要看第二步,由于所有原型對象都是Object的執行個體對象,我們看一下是不是真的是這樣
我們看到列印結果的确是這樣子的,正因為原型對象是Object 的執行個體對象,是以原型對象也都會被連結到Object的原型對象上,是以原型對象也就都會有一個__proto__指針。
其實我們可以自己去嘗試一下,就會發現執行個體與執行個體之間,都是通過__proto__這樣的一個屬性連接配接起來的,被連接配接起來的對象叫做原型對象,連接配接起來的所有原型對象就叫做原型鍊。
以上的這些就是我對原型跟原型鍊的了解。
如有描述不妥的地方請指出,小弟會非常感謝。