1.js原型(prototype)實現繼承
原型(prototype)屬性是js的一個獨有的機制,能夠理解爲當js讀取一個對象屬性的時候,對象自己若找不到這屬性時,則會去讀取構造函數的prototype對象的同名屬性,但若仍是找不到,則會去讀取Object構造函數的prototype對象的同名屬性——即所謂的「繼承」。
示例代碼以下:函數
function Person(name,age){ this.name=name; this.age=age; } Person.prototype.say=function(){ alert("Name:"+ths.name); } var person=new Person("tsingtam",24); person.say();//Name:tsingtam function Another(){} Another.prototype=new Person("Wangcc",22);//這裏實現繼承,Another繼承Person的屬性 var another=new Another(); Another.prototype.work="teacher"; Another.prototype.info=function(){ alert(this.work); } another.say();//Name:Wangcc another.info();//teacher
以上代碼是用原型方式實現的繼承。
2.構造函數實現繼承(組合繼承)
先看代碼this
function SuperTYpe(name){ this.name=name; ths.colors=["red","black","white"]; } SuperType.prototype.sayName=function(){alert(this.name);}; function SubType(name,age){ SuperType.call(this,name);//繼承屬性, 第二次調用SuperType() this.age=age; } SubType.prototype=new SuperType();//繼承方法, 第一次調用SuperType() SubType.prototype.constructor=SubType; SubType.prototype.sayAge=function(){ alert(this.age); } var obj1=new SubType("tsingtam"24); obj1.colors.push("green"); alert(obj1.colors);//"red,black,white,black" obj1.sayName();//"tsingtam" obj1.sayAge();//24 var obj2=new SubType("tanxin",25); alert(obj2.colors);// "red,black,white" obj2.sayName();//"tanxin" obj2.sayAge();//25
以上代碼中融入了原型和構造函數,避免了單一原型或構造函數的缺陷,融合了他們的優勢。這是最經常使用的繼承模式,不過他的不足就是不管在什麼狀況下,都會兩次超類型的構造函數,一次在建立子類原型的時候,另外一次在子類型構造函數內部。
3.寄生組合繼承
這是一種實現基於類型繼承的最有效的方式。
來看代碼spa
function inheritPrototype(SubType,SuperType){ var prototype=object(superType.prototype); prototype.constructor=subType; subType.prototype=prototype; } function SuperTYpe(name){ this.name=name; ths.colors=["red","black","white"]; } SuperType.prototype.sayName=function(){alert(this.name);}; function SubType(name,age){ SuperType.call(this,name); this.age=age; } inheritPrototype(SubType,SuperType); SubType.prototype.sayAge=function(){ alert(this.age); }
這段代碼只調用了一次SuperType構造函數,體現出了他的高效性,也避免了在SubType.prototype上建立沒必要要的屬性。
總結一下:
js主要是經過原型鏈實現繼承。原型鏈的構建是經過將一個類型的實例賦值給另外一個夠着韓式的原型實現的。但原型鏈餓問題是對象實例共享全部繼承的屬性和方法,因此不能單獨使用。
使用最多的繼承模式是組合繼承,寄生組合繼承被認爲是最理想的繼承模式。prototype