js的继承方案

来源:互联网 发布:安庆网络广播电视 编辑:程序博客网 时间:2024/05/30 20:07

js中的继承:


js中继承的方式有很多种,但是我只想将两种比较不错的方案



1.原型组合式继承
//父类
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.showName=function(){
alert(this.name);
}
//子类
function Man(name,age,sex){
Person.call(this,name,age);
this.sex=sex;
}
Man.prototype=new Person();
Man.prototype.constructor=Man;
var man1=new Man("张三",12,"man")


注:上面定义了一个父类Person,一个子类Man,在继承的时候使用Person.call(this,name,age)这个方法来继承父类的属性,其继承属性的本质就是在Man这个子类中添加父类的属性,调用call这个方法,指定this指向Man这样,父类中的this就指向了子类,父类中调用this.name这个this就是Man,所以就等于是子类中加入了

this.name=name;和
this.age=age;这两行代码,而继承父类的方法就更简单了,就是将子类的原型指向父类的实例,这样通过父类的实例就能调用到父类的方法了,而原型中的this就是谁调用了他就是谁,明显是子类实例在调用方法,那么this就指向子类实例




2.寄生式组合继承


//父类
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.showName=function(){
alert(this.name);
}
//子类
function Man(name,age,sex){
Person.call(this,name,age);
this.sex=sex;
}
//复制原型
function createPrototypeObj(oldObj){
function Fn(){}
Fn.prototype=oldObj;
return new Fn();
}

//继承父类的方法
function inheritanceFn(supObj,subObj){
var prototype=
createPrototypeObj(supObj.prototype);//以父类的原型对象为蓝本创建副本
subObj.prototype.constructor=subObj;
subObj.prototype=prototype;
}
//实现继承
inheritanceFn(Person,Man);
var man1=new Man("张三",12,"man")
注:这种方法了上面的方法类似,继承父类属性的方案是一样的,在继承父类的方法的选择上是以父类的原型为模板复制了一个对象出来,再将这个对象赋值给子类的原型,这样子类的实例就能够调用到父类的方法了,当然在复制父类的原型对象方面还有别的办法,比如说:new Object(父类的原型)或者Object.create(父类的原型),都能够创建父类原型的复制版,还有一点就是在上一种继承父类方法的实践中,子类原型指向的是父类的实例,由此父类构造函数中的属性也被存在于子类原型中,而第二种方法,子类原型中就没有父类的属性,这点是比上种方法要好的


最后一点:本文内容主要来自于JavaScript高级程序设计(第三版),加上自己的理解,不对之处敬请指正!!












原创粉丝点击