天天看點

javascript中原型與原型鍊的了解

這篇部落格隻是用來記錄自己所學的知識。

說到繼承,應該先提一下原型跟原型鍊。

那麼什麼是原型,我自己個人的了解是原型是一個對象,是一個當我們一行代碼都不寫就已經存在的那些對象,而且這些對象中包含的屬性可以被其constructor屬性指向的構造函數的所有執行個體共享。

比如我們在控制台輸入Object.prototype,Array.prototype,Function.prototype等,回車的時候我們就能夠看到結果裡有很多東西。

如下圖:

javascript中原型與原型鍊的了解

每個原型對象裡面都會有一個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的執行個體對象,我們看一下是不是真的是這樣

javascript中原型與原型鍊的了解

我們看到列印結果的确是這樣子的,正因為原型對象是Object 的執行個體對象,是以原型對象也都會被連結到Object的原型對象上,是以原型對象也就都會有一個__proto__指針。

其實我們可以自己去嘗試一下,就會發現執行個體與執行個體之間,都是通過__proto__這樣的一個屬性連接配接起來的,被連接配接起來的對象叫做原型對象,連接配接起來的所有原型對象就叫做原型鍊。

以上的這些就是我對原型跟原型鍊的了解。

如有描述不妥的地方請指出,小弟會非常感謝。

繼續閱讀