1. 程式人生 > >javascript面向對象(三)--繼承

javascript面向對象(三)--繼承

單獨 基於 可能 span 類對象 func 問題 rip div

 1 //繼承: ECMAScript只支持 實現繼承  依靠原型鏈來實現
 2 //一、原型鏈
 3 //先來理清下關系:
 4 //每個構造函數都會有一個原型對象              Person --> prototype
 5 //每一個原型對象都會有一個指向構造函數的指針   Person.prototype.constructor --> Person
 6 //每一個實例都包含一個指向原型對象的內部指針    person1 --> prototype
 7 //當原型對象等於另一個類的實例的時候,那麽原型對象就會包含一個指向另一個對象的指針,進而也就有了指向另一個構造函數的指針
 8
//若幹個原型對象層層遞進,就會成為一條原型鏈。 9 10 //對於熟悉OO語言來說,js的繼承於傳統語言的繼承在概念上還是比較通用的 11 //1.它基於原型鏈上的繼承。 12 //以 子類.原型對象 = 父類實例來實現繼承關系。 son.prototype = new Father() 來實現 13 //不要與傳統語言混肴,傳統語言使用 父類指針指向子類對象的方式來聲明一個對象 14 //js使用 子類的原型對象指向父類對象的方式實現繼承關系 15 //2.子類繼承父類之後,就會有了父類的屬性於方法。子類屬性可以覆蓋父類屬性,子類方法可以重寫父類方法(有待驗證)
16 //3.程序在搜索屬性字段時,會先從自身實例中搜索,如果搜索不到,在依次按照原型鏈向上搜索 17 //4.原型鏈上最頂層時Object對象,所有函數的原型都是Object的實例 18 //5.子類實例調用父類方法與父類實例調用父類方法的結果可能不會相同。子類繼承父類的方法與屬性之後,可以近似的看作“獨立”兩個對象 19 //6.使用字面量法創建原型對象會切斷掉原型鏈。 20 //7.原型鏈問題一、不能向父類構造函數傳遞參數,因此很少有人單獨的使用原型鏈 21 //8.原型鏈問題二、上一節提到引用類型的參數不能放在prototype對象中聲明,因為該參數會被共享。 22 //但是對於父類聲明的引用類型的參數,子類在繼承的時候不可避免的在子類的proprtype中繼承了該參數,
23 //導致子類的所有實例對象都會共享這一參數。 24 function Father(){ 25 this.property = true; 26 } 27 Father.prototype.getFatherValue =function () { 28 return this.property; 29 } 30 function Son() { 31 this.sonproperty = false; 32 } 33 Son.prototype = new Fater(); //繼承 34 // Son.prototype = { //使用該形式相當於重寫了Son的原型對象,會使得上一句失效,切斷了繼承關系 35 // getSonValue:function () { 36 // return this.sonproperty; 37 // } 38 // }; 39 40 Son.prototype.getSonValue() = function () { 41 return this.sonproperty; 42 } 43 Son.prototype.getFatherValue() = function () { 44 return false; //重寫父類的方法,在這裏,子類對象調用時返回false,父類對象調用時不受影響仍會返回true 45 }

javascript面向對象(三)--繼承