原型鏈機(jī)制:
創(chuàng)新互聯(lián)公司是一家業(yè)務(wù)范圍包括IDC托管業(yè)務(wù),網(wǎng)絡(luò)空間、主機(jī)租用、主機(jī)托管,四川、重慶、廣東電信服務(wù)器租用,資陽(yáng)托管服務(wù)器,成都網(wǎng)通服務(wù)器托管,成都服務(wù)器租用,業(yè)務(wù)范圍遍及中國(guó)大陸、港澳臺(tái)以及歐美等多個(gè)國(guó)家及地區(qū)的互聯(lián)網(wǎng)數(shù)據(jù)服務(wù)公司。在ECMAscript中描述了原型鏈的概念,并將原型鏈作為實(shí)現(xiàn)繼承的主要方法,其基本思想就是利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。
構(gòu)造函數(shù)和原型還有實(shí)例之間的關(guān)系:
每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象(prototype),原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針(constructor),而實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針 ( __propto__ ) 。關(guān)系圖如下圖所示:
每一個(gè)Function都是Object基類的一個(gè)實(shí)例,所以每一個(gè)Function上都有一個(gè)__proto__指向了Object.prototype。
當(dāng)查找一個(gè)實(shí)例的屬性時(shí),會(huì)先從這個(gè)實(shí)例的自定義屬性上找,如果沒有的話通過(guò)__proto__去實(shí)例所屬類的原型上去找,如果還沒有的話再通過(guò)原型(原型也是對(duì)象,只要是對(duì)象就有__proto__屬性)的__proto__到Object的原型上去找,一級(jí)一級(jí)的找,如果沒有就undefined。
所以引用類型之間的繼承就是通過(guò)原型鏈機(jī)制實(shí)現(xiàn)的。
一.原型繼承
原型繼承:把父類的私有+公有的屬性和方法,都作為子類公有的屬性。
核心:不是把父類私有+公有的屬性克隆一份一模一樣的給子類的公有。他是通過(guò)__proto__建立和子類之間的原型鏈,當(dāng)子類的實(shí)例需要使用父類的屬性和方法的時(shí)候,可以通過(guò)__proto__一級(jí)級(jí)找上去使用。
function Parent(){ this.x = 199; this.y = 299; } Parent.prototype.say = function(){ console.log('say') } function Child(){ this.g = 90; } Child.prototype = new Parent(); var p = new Parent(); var c = new Child(); console.dir(c)