1.構造函數,原型對象,實例對象三者之間的關係函數
每建立一個函數,該函數都會自動帶有一個prototype屬性。該屬性是一個指針,指向一個對象,該對象稱之爲原型對象(後期咱們可使用這個原型對象幫助咱們在js中實現繼承).this
原型對象上默認有一個屬性constructor,該屬性也是一個指針,指向其相關聯的構造函數。spa
經過調用構造函數產生的實例對象,都擁有一個內部屬性,指向了原型對象。其實例對象可以訪問原型對象上的全部屬性和方法。prototype
總結:三者的關係是,每一個構造函數都有一個原型對象,原型對象上包含着一個指向構造函數的指針,而實例都包含着一個指向原型對象的內部指針。通俗的說,實例能夠經過內部指針訪問到原型對象,原型對象能夠經過constructor找到構造函數。設計
實例:指針
function People(){ this.type='人' } People.prototype.showType=function(){ alert(this.type); } var person=new People(); //調用原型對象上面的方法 person.showType();//最後結果彈框彈出人
以上代碼定義了一個構造函數People(),People.prototype指向原型對象,其自帶屬性construtor又指回了People,即People.prototype.constructor==People.實例對象person因爲其內部指針指向了原型對象,因此能夠訪問原型對象上的showType方法。code
記住People.prototype只是一個指針,指向的是原型對象,利用這個指針能夠幫助咱們實現js繼承對象
2.原型鏈blog
在第一部分咱們說到,全部的實例都有一個內部指針指向他的原型對象,而且能夠訪問到原型對象上的全部屬性和方法。person實例對象指向了People的原型對象,能夠訪問People原型對象上的全部屬性和方法。若是People原型對象變成了某一個類的實例aaa,這個實例又會指向一個新的原型對象AAA,那麼person此時能訪問aaa的實例屬性和AAA原型對象上的全部屬性和方法了。同理新的原型對象AAA碰巧有事另一個對象的實例bbb,這個對象實例指向原型對象BBB,那麼person就能訪問bbb的實例屬性和BBB原型上的屬性和方法了。
繼承
function People(){ this.type='人' } People.prototype.showType=function(){ alert(this.type); } function Woman(){ this.sex='女'; this.age=34; } Woman.prototype=new People(); var w=new Woman();
console.log('你們好,個人種類是:'+w.type+",個人年齡是:"+w.age+",個人性別是:"+w.sex);
//輸出結果:
//你們好,個人種類是:人,個人年齡是:34,個人性格是:女
//w.type是People上面定義的type
解釋一下以上代碼.以上代碼,首先先定義了People構造函數,經過new People()獲得實例,會包含一個實例對象type和一個原型屬性showType。另外定義一個Woman構造函數,而後狀況發生變化,原本構造函數woman的prototype會執行Woman的原型對象,可是咱們這裏稍有改變,將Woman構造函數的prototype指向了People實例對象覆蓋了woman的原型對象。當Woman的實例對象woman去訪問type屬性時,js首先在woman實例屬性中查找,發現沒有定義,接着去woman的原型對象上找,woman的原型對象這裏已經被咱們改爲了People實例,那就是去People實例上去找。先找People的實例屬性,發現沒有type,最後去People的原型對象上去找,終於找到了。這個查找就是這麼一級一級的往上查找。
function People(){ this.type='人' } People.prototype.showType=function(){ alert(this.type); } function Woman(){ this.sex='女'; this.age=34;
this.type='女生';//若是這裏定義了type屬性,就不會層級查找,最後在People找到該屬性 } Woman.prototype=new People(); var w=new Woman(); console.log('你們好,個人種類是:'+w.type+",個人年齡是:"+w.age+",個人性別是:"+w.sex); //輸出結果: //你們好,個人種類是:女生,個人年齡是:34,個人性格是:女
這就說明,咱們能夠經過原型鏈的方式,實現 Woman繼承 People 的全部屬性和方法。
總結來講:就是當重寫了Woman.prototype指向的原型對象後,實例的內部指針也發生了改變,指向了新的原型對象,而後就能實現類與類之間的繼承了。
(文章內容全都參考於《JAVASCRIPT 高級程序設計》)