前言
最近看了好多文章,讓我感覺作為一個前端,如果不了解原型和原型鏈的話就不是一個好前端(我就不是個好前端??)!
這篇算是寫給自己的筆記吧,這個概念還是蠻難融會貫通的。欸~我到現(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版)