1.什么是继承?
继承(英语:inheritance)是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。 一般静态的面向对象编程语言,继承属于静态的,意即在子类别的行为在编译期就已经决定,无法在执行期扩充。(维基百科)
2.为什么要继承?
代码重用
3.如何继承?
a.拷贝继承:顾名思义就是拷贝父类的方法与属性
function Person(name){//父类
this.name=name;
}
Person.prototype.getName=function (){//父类方法
console.log(this.name);
}
function Male(name,sex){
Person.call(this,name);//调用父类构造函数 拷贝属性
this.sex=sex;
}
extend(Person.prototype,Male.prototype);//拷贝父类方法
Male.prototype.getSex=function (){//子类添加的方法
console.log(this.sex);
}
function extend(obj1,obj2) {//将对象1的方法拷贝到对象2中
for(var attr in obj1){
obj2[attr]=obj1[attr];
}
}
var P1=new Person();
var M1=new Male();
通过Firebug可以看到
M1通过拷贝继承了Person的属性与方法,未使用原型链.
b.类式继承:利用构造函数继承的方式继承属性,原型链继承方法
function Person(name){//父类
this.name=name;
}
Person.prototype.getName=function (){//父类方法
console.log(this.name);
}
function Male(){
Person.call(this,name);//调用父类构造函数 拷贝属性
}
Male.prototype=new Person();//通过原型链链接 继承方法
Male.prototype.constructor=Male;//修正指向问题
var P1=new Person();
var M1=new Male();
通过Firebug可以看到
原型链
Person.prototype<------Person()=Male.prototype<------Male()
getName() name name
4.总结
我理解的JS的继承方式大致分两类,使用原型链和不使用原型链,然后如何使用原型链进行继承这里不做过多的讨论