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));问题1.包含引用类型值的原型。
问题2.不能像超类型的构造方法传参。
2.借用构造函数(constructor stealing)(伪造对象或经典继承)(1)无参:
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问题:方法在构造函数中定义,无法复用。
3.组合继承(combination inheritance)(伪经典继承)
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
新闻热点
疑难解答