一、原型链继承:
function SuperType(){ this.colors = ["red", "blue", "green"]; }
SuperType.prototype.Fun = function(){ }; function SubType(){ } //继承了SuperType
SubType.prototype = new SuperType(); var instance1 = new SubType();
instance1.colors.push("black"); alert(instance1.colors);
//"red,blue,green,black" var instance2 = new SubType();
alert(instance2.colors); //"red,blue,green,black"
优点:能通过instanceOf和isPrototypeOf的检测

注意:给原型添加方法的语句一定要放在原型替换SubType.prototype = new SuperType();之后
缺点:(1)SuperType中的属性(不是方法)也变成了SubType的prototype中的公用属性,
     如上面例子中的color属性,可以同时被instance1和instance2修改
     (2)创建子类型的时候,不能像父类型的构造函数中传递参数。

二、借用构造函数
function SuperType(){ this.colors = ["red", "blue", "green"]; } function
SubType(){ //继承了SuperType SuperType.call(this); } var instance1 = new
SubType(); instance1.colors.push("black"); alert(instance1.colors);
//"red,blue,green,black" var instance2 = new SubType();
alert(instance2.colors); //"red,blue,green" function SuperType(name){ this.name
= name; } function SubType(){ //继承了SuperType,同时还传递了参数 SuperType.call(this,
"Nicholas"); //实例属性 this.age = 29; } var instance = new SubType();
alert(instance.name); //"Nicholas"; alert(instance.age); //29
原理:在子类型构造函数的内部调用超类型构造函数
优点:解决了superType中的私有属性变公有的问题,可以传递参数
缺点:方法在函数中定义,无法得到复用

三、组合继承:
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.constructor = SubType; SubType.prototype.sayAge = function(){
alert(this.age); }; var instance1 = new SubType("Nicholas", 29);
instance1.colors.push("black"); alert(instance1.colors);
//"red,blue,green,black" instance1.sayName(); //"Nicholas"; instance1.sayAge();
//29 var instance2 = new SubType("Greg", 27); alert(instance2.colors);
//"red,blue,green" instance2.sayName(); //"Greg"; instance2.sayAge(); //27
优点:继承前两者的优点,能通过instanceOf和isPrototypeOf的检测
缺点:两次调用父构造器函数,浪费内存。

四、原型式继承:
function object(o){ function F(){} F.prototype = o; return new F(); }
使用场合:没必要构建构造函数,仅仅是想模拟一个对象的时候

五、寄生继承:
function createAnother(original){ var clone = object(original);
//通过调用函数创建一个新对象 clone.sayHi = function(){ //以某种方式来增强这个对象 alert("hi"); }; return
clone; //返回这个对象 } var person = { name: "Nicholas", friends: ["Shelby", "Court",
"Van"] }; var anotherPerson = createAnother(person); anotherPerson.sayHi();
//"hi"缺点:方法在函数中定义,无法得到复用

六:寄生组合继承(最理想):
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); };

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信