這可能是一個(gè)??闯P碌膯栴},因?yàn)?。。我總是記不住。所以來寫一篇,順便加深一下自己的記憶?/p>
先說prototype。
每創(chuàng)建一個(gè)新函數(shù),都會(huì)創(chuàng)建一個(gè)prototype(原型)屬性,例如:
function Person() {}
var person1 = new Person();
var person2 = new Person();

如上圖所示,person1和person2內(nèi)部的指針都指向了Person.prototype,而不是Person本身。
這個(gè)(prototype)屬性是一個(gè)指針,指向函數(shù)的原型對象。所有原型對象都會(huì)自動(dòng)獲得一個(gè)constructor(構(gòu)造函數(shù))屬性,這個(gè)屬性指向prototype屬性所在函數(shù)的指針。如上述例子中,Person.prototype.constructor 就指向Person。
JS中提供了isPrototypeOf()和getPrototypeOf()來進(jìn)行原型的判斷和獲取原型。大部分瀏覽器都支持這種寫法。IE9以下是不提供的。
需注意的是,當(dāng)代碼讀取某個(gè)對象的屬性時(shí),它會(huì)先對該對象進(jìn)行搜索,搜索不到的時(shí)候會(huì)去它指向的原型對象去搜索。如person1.name,在沒有定義的情況下就會(huì)去Person.prototype里面尋找,從而返回“Nicholas”。
接下來談一下原型鏈。
原型鏈的基本思想,是利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。也就是說,函數(shù)A()有一個(gè)原型對象A.prototype,A.prototype包含一個(gè)指向A的指針,這時(shí)候?qū)嵗鼴=new A(), B就包含了一個(gè)指向A.prototype的指針。那么如果這時(shí)讓A.prototype = new C()呢?這時(shí)候A.prototype就包含了一個(gè)指向C的指針,如果C.prototype 又等于new D()......就這樣層層遞進(jìn),就構(gòu)成了實(shí)例與原型的鏈條。以上就是原型鏈的基本概念。
要想確定原型和實(shí)例之間的關(guān)系,
第一種方法是instanceof操作符。例如: B instanceof Object; B instanceof A; B instanceof C; 結(jié)果都為true
第二種方法是isPrototypeOf()。例如: A.prototype.isPropotypeOf(B); 結(jié)果也為true。
原型鏈最大的弊端就是引用類型的屬性會(huì)被所有實(shí)例共享,實(shí)踐中很少單獨(dú)使用原型鏈。但是這些原理還是需要弄明白的,以上就是本次總結(jié)的全部知識點(diǎn)啦,下次再聊~
歡迎來留言
參考:《JavaScript高級程序設(shè)計(jì)》(第3版)