原型與原型鏈簡介

前言

最近看了好多文章,讓我感覺作為一個前端,如果不了解原型和原型鏈的話就不是一個好前端(我就不是個好前端??)!
這篇算是寫給自己的筆記吧,這個概念還是蠻難融會貫通的。欸~我到現(xiàn)在也還是一知半解啊。(發(fā)愁)

1、原型
我們創(chuàng)建的每個函數(shù)都有一個prototype(原型)屬性,在默認(rèn)情況下,所有原型對象都會自動獲得一個constructor(構(gòu)造函數(shù))屬性,這個屬性包含一個指向prototype屬性所在函數(shù)的指針。例子:

function Person() {} // 創(chuàng)建一個函數(shù)
Person.prototype.constructor = Person // Person就是prototype屬性所在函數(shù)

當(dāng)調(diào)用構(gòu)造函數(shù)創(chuàng)建一個實例時,該實例的內(nèi)部就會包含一個指針,指向構(gòu)造函數(shù)的原型對象,例子:

function Person() {} // 創(chuàng)建一個函數(shù)
let person1 = new Person()  // 創(chuàng)建一個實例
person1.__proto__ === Person.prototype // true

2、原型鏈
原型對象 = 另一個類型的實例
因為實例中包含一個指向原型對象的指針,所以如果讓一個原型對象等于另一個類型的實例,此時的原型對象將包含一個指向另一個原型的指針,相應(yīng)地,另一個原型中也包含著一個指向另一個構(gòu)造函數(shù)的指針。如此層層遞進(jìn),就構(gòu)成了實例與原型的鏈條。這就是所謂原型鏈的基本概念。例子:

function A () {
    this.a = true
}

A.prototype.getA = function () {return this.a}

function B  ()  {}

B.prototype = new A() // B的原型指向A的實例

let b = new B() // b是B的實例

b.getA() // true

此時,

b. __proto__ = B.prototype
// B.prototype指向了A的實例,所以B的原型對象不是默認(rèn)的了,也沒有默認(rèn)的 constructor
b. __proto__. __proto__ = A.prototype

這個概念原本是打算在網(wǎng)上看博客的,但是發(fā)現(xiàn)很多博客寫的并不是很嚴(yán)謹(jǐn),無賴之下只好自己看JS高程。強(qiáng)烈建議各位如果方便的話,最好直接去看JS高程第六章面向?qū)ο蟮某绦蛟O(shè)計,比大部分博客好理解,而且知識體系介紹的也比較全面,超級贊!
如果有什么不理解的地方歡迎討論,一起加油吧~??
本文參考JavaScript高級程序設(shè)計(第3版)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容