自己對於j**ascript繼承的概念總是一知半解,知道那麼一回事但是又說不上來,今天好好總結一下,希望能夠把這塊給弄清楚。
一、首先需要知道:js主要是通過原型鏈來繼承。其基本思想是利用原型讓乙個引用型別繼承另乙個引用型別的屬性和方法。
二、那麼要簡單粗暴地實現繼承的話,有這麼一句話就夠了:
child.prototype = new parent();
當然僅僅這行**是萬萬不夠的,它有很多問題:
1、child的constructor指向了parent的例項;
2、子類不僅繼承了方法,還繼承了超類建構函式裡面的屬性;
3、子類的修改會影響超類。
三、帶著這些問題,我們可以想盡辦法去解決掉這些麻煩,由此引申更佳的繼承方式:組合繼承、原型式繼承、寄生組合式繼承
四、先說組合繼承(又叫經典繼承或者類式繼承),請看下面**:
functionparent(name)
parent.prototype.showname = function
()function
child(name, age)
//關鍵:利用空的建構函式
//使用原型鏈繼承共享的屬性和方法
var f = function
(){};
f.prototype =parent.prototype;
child.prototype = new
f();
child.prototype.constructor = child; //
注意還原子類的constructor指向
組合繼承的關鍵是分開繼承例項屬性以及共享屬性和方法,避免了單獨使用原型鏈和借用建構函式的缺陷,是js中最常用的繼承方式。
五、原型式繼承,它是在2023年被被提出來的乙個概念,**如下:
function object(o);//建立乙個臨時的建構函式f.prototype = o;//將傳入的物件作為這個建構函式的原型
return new f();//返回這個臨時型別的乙個例項
}// 本質上講:object()對傳入的物件執行了一次淺複製
後來es5新增了object.create()方法來規範了原型式繼承,它在只傳乙個引數的情況下與object()方法一樣。
object.create()可以有第二個引數,這裡就不詳細說明了。
那麼問題來了,這個原型式繼承有什麼缺點呢?
它的缺點就是子類例項修改包含引用型別值的屬性的話,父類也會隨之改變。(包含引用型別值的屬性始終都會共享相應的值)
當然如果只是想讓乙個物件與另乙個物件保持類似的情況下,原型式繼承是可以勝任的。
六、還有其他的繼承方式比如:寄生式繼承和寄生組合式繼承,有時間會去研究。
js中的繼承
繼承有兩種方式 介面繼承和實現繼承。介面繼承只繼承方法簽名,而實現繼承則繼承實際的方法。由於函式沒有簽名,在ecmascript中無法實現介面繼承。ecmascript只支援實現繼承,而且實現繼承主要依靠原型鏈來實現。下面介紹幾種js的繼承 原型鏈繼承實現的本質是重寫原型物件,代之以乙個新型別的例項...
JS中的繼承
定義乙個動物類 實現下面的繼承 function animal name animal.prototype.eat function food 1 原型鏈繼承 核心 將父類的例項作為子類的原型 function cat cat.prototype new animal cat.prototype.n...
JS中的繼承
對於乙個從事前端開發的工作者,如果對js中的原型 原型鏈 繼承等這些了解不透徹,說明你還是個初學者哦!下面我們來談談繼承這些事吧 建構函式中有乙個 prototype的指標,指向其原型物件,原型物件中有乙個constructor指標指向建構函式,例項中有乙個 prototype 指標指向原型物件。那...