1.構造函數,原型對象,實例對象三者之間的關系
每創建一個函數,該函數都會自動帶有一個prototype屬性。該屬性是一個指針,指向一個對象,該對象稱之為原型對象(后期我們可以使用這個原型對象幫助我們在js中實現繼承).
原型對象上默認有一個屬性constructor,該屬性也是一個指針,指向其相關聯的構造函數。
通過調用構造函數產生的實例對象,都擁有一個內部屬性,指向了原型對象。其實例對象能夠訪問原型對象上的所有屬性和方法。
總結:三者的關系是,每個構造函數都有一個原型對象,原型對象上包含着一個指向構造函數的指針,而實例都包含着一個指向原型對象的內部指針。通俗的說,實例可以通過內部指針訪問到原型對象,原型對象可以通過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方法。

記住People.prototype只是一個指針,指向的是原型對象,利用這個指針可以幫助我們實現js繼承
2.原型鏈
在第一部分我們說到,所有的實例都有一個內部指針指向他的原型對象,並且可以訪問到原型對象上的所有屬性和方法。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 高級程序設計》)

