1. 原型鏈繼承:
function SuperType(){ this.PRoperty = true;}SuperType.prototype.getSuperValue = function (){ return this.property;}function SubType(){ this.subproperty = false;}SubType.prototype = new SuperType();SubType.prototype.getSubValue = function (){ return this.subproperty;}var instance = new SubType();alert(instance.getSuperValue());alert(instance instanceof Object);alert(instance instanceof SuperType);alert(instance instanceof SubType);alert(Object.prototype.isPrototypeOf(instance));alert(SuperType.prototype.isPrototypeOf(instance));alert(SubType.prototype.isPrototypeOf(instance));問(wèn)題1.包含引用類型值的原型。
問(wèn)題2.不能像超類型的構(gòu)造方法傳參。
2.借用構(gòu)造函數(shù)(constructor stealing)(偽造對(duì)象或經(jīng)典繼承)(1)無(wú)參:
function SuperType(){ this.colors = ['red','blue','green'];}function SubType(){ SuperType.call(this);}var instance1 = new SubType();instance1.colors.push("black");alert(instance1.colors); var instance2 = new SubType();var instance3 = new SuperType();alert(instance3.colors);(2)傳參:function SuperType(name){ this.name = name;}function SubType(){ SuperType.call(this,"zhangsan"); this.age = 20;}var instance1 = new SubType();alert(instance1.name); //zhangsanalert(instance1.age); //20var instance2 = new SuperType();alert(instance2.name); //undefinedalert(instance2.age); //undefined問(wèn)題:方法在構(gòu)造函數(shù)中定義,無(wú)法復(fù)用。
3.組合繼承(combination inheritance)(偽經(jīng)典繼承)
function SuperType(name){ this.name = name; this.colors = ["red","blue","green"];}SuperType.prototype.sayName = function(){ alert(this.name);}function SubType(name,age){ //繼承屬性 SuperType.call(this,name); this.age = age;}//繼承方法SubType.prototype = new SuperType();SubType.prototype.sayAge = function(){ alert(this.age);}var instance1 = new SubType("zhangsan",20);instance1.colors.push("black");alert(instance1.colors); // red,blue,green,blackinstance1.sayName(); //zhangsaninstance1.sayAge(); // 20var instance2 = new SubType("lisi",30);alert(instance2.colors); // red,blue,greeninstance2.sayName(); //lisiinstance2.sayAge(); // 304. 原型式繼承(Prototypal inheritance)function object(o){ function F(){} F.prototype = o; return new F();}var person = { name:"zhangsan", friends :["guojing","huangrong"]};var anotherPerson = object(person);anotherPerson.name = "lisi";anotherPerson.friends.push("zhoubotong");var yetAnotherPerson = object(person);yetAnotherPerson.name = "wangwu";yetAnotherPerson.friends.push("yidengdashi");alert(person.friends); // guojing,huangrong,zhoubotong,yidengdashi5.寄生式繼承(parasitic)function object(o){ function F(){} F.prototype = o; return new F();}function createAnother(original){ var clone = object(original); clone.sayHi = function(){ alert("hello"); }; return clone;}var person = { name:"zhangsan", friends :["guojing","huangrong"]};var anotherPerson = createAnother(person);//anotherPerson.sayHi(); //helloanotherPerson.name = "lisi";anotherPerson.friends.push("zhoubotong");var yetAnotherPerson = object(person);yetAnotherPerson.name = "wangwu";yetAnotherPerson.friends.push("yidengdashi");alert(person.friends); // guojing,huangrong,zhoubotong,yidengdashialert(anotherPerson.friends); // guojing,huangrong,zhoubotong,yidengdashialert(yetAnotherPerson.friends); // guojing,huangrong,zhoubotong,yidengdashi6.寄生組合式繼承function object(o){ function F(){} F.prototype = o; return new F();}function inheritPrototype(subType,superType){ var prototype = object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype;}function SuperType(name){ this.name = name; this.colors = ["red","blue","green"];}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);}var instance = new SubType("zhangsan",30);alert(instance.name); //zhangsaninstance.sayName(); //zhangsan instance.sayAge(); // 30
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注