標籤:入參 繼承 alert .property als 傳參 傳參數 模式 log
在物件導向語言中繼承分成兩種:介面繼承和實現繼承。解釋一下,介面繼承只繼承方法的簽名,而實現繼承則是繼承實際的方法。但是ECMAScript中的函數沒有簽名所以無法進行介面繼承,只能是實現實現繼承。而實現繼承通常是依賴與原型鏈的。
原型鏈繼承
原型的概念已經在上一篇中說過了。還是來簡單的回顧一下建構函式,原型和執行個體的關係:每個建構函式都有一個圓形對象,原型對象都包含一個指向建構函式的指標,而執行個體都包含一個指向原型對象的內部指標。但是如果讓一個建構函式的原型指標指向另一個對象。那麼這時的原型對象將包含一個指向另一個的原型的指標,如果層層遞進的話就形成了原型鏈。
function SupType(){ this.property=true;}SupType.prototype.getSupValue=function(){ return this.property;}function SubType(){ this.subproperty=false;}SubType.prototype=new SupType();SubType.prototype.getSubValue=function(){ return this.subproperty;}var instace=new SubType();alert(instace.getSupValue());
這就是上面代碼的原型圖解。可以看到SubType的Prototype是指向一個SuperType的執行個體。SubTypePrototype並沒有所謂的建構函式。這就是原型鏈的繼承。當然不要忘記SuperType也是繼承Object的。
可以用兩個方式來進行判斷原型和執行個體之間的關係。第一中是 instanceof操作符。
alert(instace instanceof Object);alert(instace instanceof SubType);alert(instace instanceof SupType);
返回為true則為執行個體是原型鏈中出現過的建構函式。
還有一種就是isPrototypeof()方法。
alert(Object.prototype.isPrototypeOf(instace));alert(SubType.prototype.isPrototypeOf(instace));alert(SupType.prototype.isPrototypeOf(instace));
原型鏈和原型模式的建構函式有著一樣的缺點,所有的引用實值型別會被所有的執行個體所引用。而且不能給父類的建構函式傳參數。所以就會借用建構函式的方法以組合的方法進行函數的繼承。
借用建構函式的方式
其實這種原理十分簡單就是在子類型的建構函式內部調超類型的建構函式。
function SupType(){ this.colors=["red","blue","green"];}function SubType(){ SupType.call(this);}var instance1=new SubType();instance1.colors.push("black");alert(instance1.colors);var instance2=new SubType();alert(instance2.colors);
在上面的代碼中,在instance1中new的時候this就是intance1,然後調用了父類SupType的建構函式,在this的屬性上添加了colors的屬性。然後返回給instance1。這樣每個執行個體都有獨立的colors屬性。
組合繼承
顧名思義就是將使用原型鏈和建構函式兩種進行組合繼承。
function SupType(name){ this.name=name; this.colors=["red","blue","green"];}SubType.prototype.sayName=function(){ alert(this.name);}function SubType(name,age){ SupType.call(this,name); this.age=age;}SubType.prototype=new SupType();SubType.prototype.constructor=SubType;SubType.prototype.sayAge=function(){ alert(this.age);}
在上面的代碼中,需要共用的就添加到父類的原型中如方法SayName,不需要共用的就添加到建構函式中。在子類的建構函式中會有調用父類的建構函式,而且能傳入參數。進行參數的初始化。這是JavaScript中最常用的繼承模式。
寄生模式
js物件導向程式設計之繼承