参考
web前端开发必懂之一:JS继承和继承基础总结https://www.cnblogs.com/diligenceday/p/4246515.html
最后提供一些参考的链接:
js面对对象详解:
https://www.cnblogs.com/chenmeng0818/p/6508755.html
javascript 类属性、类方法、类实例、实例属性、实例方法、prototype、proto 测试与小结:
http://www.cnblogs.com/mrsunny/archive/2011/05/09/2041185.html
JS的构造函数:
http://www.cnblogs.com/jikey/archive/2011/05/13/2045005.html
浅析Javascript原型继承:
http://blog.youkuaiyun.com/kittyjie/article/details/4380918
一、对象冒充
function zoo(name,num){
this.name=name;
this.num=num;
}
zoo.prototype.intro=function(){
return this.name+"动物园有"+this.num+"只动物";
}
function hefei(name,num,str){
zoo.call(this,name,num);//用call()方法冒充,还可以用apply()方法,如下一行
//zoo.apply(this,[name,num]);//实际上,apply和call的功能是一样的,只是传入的参数列表形式不同。
this.str=str;
}
hefei.prototype.type=function(){
return "天朝"+this.name+"动物园动物种类有:"+this.str.toString();
}
var xinxin=new hefei("欣欣","10",["狮子","熊猫","老虎"]);
alert(xinxin.type());
原理:通过使用call、apply方法可以在新创建的对象上执行构造函数,用父类的构造函数来增加子类的实例
1)优点:简单明了,直接继承超类构造函数的属性和方法
2)缺点:无法继承原型链上的属性和方法
二、原生链继承
function zoo(){
this.name="欣欣";
this.num="10";
}
zoo.prototype.intro=function(){
return this.name+"动物园有"+this.num+"只动物";
}
function hefei(str){
this.str=str;
//this.type=function(){
// return "天朝"+this.name+"动物园动物种类有:"+this.str.toString();
//}//非原型方法会继承
}
//在前面写原型的方法会被覆盖
// hefei.prototype.type=function(){
// return "天朝"+this.name+"动物园动物种类有:"+this.str.toString();
// }
hefei.prototype=new zoo();
// 注意这里new zoo()生成的超类对象并没有constructor属性,故需添加上
// hefei.prototype.constructor = hefei;
hefei.prototype.type=function(){
return "天朝"+this.name+"动物园动物种类有:"+this.str.toString();
}
var xinxin=new hefei(["狮子","熊猫","老虎"]);
alert(xinxin.type());
原理:利用原型链来实现继承,超类的一个实例作为子类的原型
1)优点
简单明了,容易实现
实例是子类的实例,实际上也是父类的一个实例
父类新增原型方法/原型属性,子类都能访问到
2)缺点
所有子类的实例的原型都共享同一个超类实例的属性和方法
无法实现多继承