继承是在原有对象基础上,略作修改,得到一个新的对象,而不影响元有对象的功能。
添加加成的方法:
1.继承属性
call方法来继承属性,实现如下:
//父类
function createPerson(name,age){
this.name=name;
this.age=age;
}
function createArt(job){
createPerson.call(this,name,age);//当前createArt对象,继承createPerson中的name和age属性;createArt也有name和age属性;
}
2.继承方法(面向对象的拷贝继承)
1,for in莱继承方法,实现如下
var a={
name:"小明";
}
var b=a;//通过赋值的方式创建对象,新创建的对象的属性值改变时,原来对象的属性值也会变化,下两行可以看出
b.name="李四";
alert(a.name);//a.name="李四";
要创建新的对象b,且新对象属性质的改变不影响原来对象,可以用for in来完成,如下:
for( var attr in a){
b[attr]=a[attr];//把a中的属性复制到b中,
}
b.name="lisi";//修改b中属性值,不会影响a,如下测试:
alert(a.name);//a.name依然是原来的“小明”;
2,for in莱继承方法的另外一种写法(封装上1的写法):
function AAA(name,age){
this.name=name;
}
function BBB(name){
this.name=name;
}
AAA.prototype.showjob={}
function Extend(obj1,obj2){
for(var attr in obj1){//这种形式是基本类型的复制,不牵涉对象的引用
obj2[attr]=obj1[attr];
}
}
Extend(AAA.prototype,BBB.prototype)
BBB中也会有一个showjob方法
3,有瑕疵的方法继承:
//属性继承的方式是调用父类的构造函数call
function Creatperson(name,age){//父类
this.name=name;
this.age=age;
console.log(this);
}
Creatperson.prototype.showname=function(){
alert(this.name);
}
var p1=new Creatperson("小名","20");
p1.showname();
//也可以通过call()和apply()方法,自主修改this的环境指向,
function CreatStar(name,age,job){//子类
//Creatperson(name,age);//函数前没有调用的东西,所以this是window ,这句话代表子类对父类中name和age属性的继承
Creatperson.call(this,name,age);//this至当前对象CreatStar,CreatStar调用Creatperson中的name和age
this.job=job;
}
//父类的原型赋给子类的原型.来完成方法的继承
CreatStar.prototype=Creatperson.prototype;//Creatperson.prototype;是一个对象,把一个对象付给另一个对象,就实现了对象下方法的继承;
var p2=new CreatStar("A明","22","it");
p2.showname();
//这种方法存在的问题:对象赋给对象,出现了对象的引用,修改子类的原型,会影响到到父类,这不符合面向对象中,关于继承不应影响原有(父类)方法的功能的概念,所以这种写法是不可能,只能通过原型的复制
//测试以下:修改子类原型,父类受影响也会改变:<br />
CreatStar.prototype.showJob=function(){//子类添加一个showJob方法
alert(this.job)
}
console.log(p1);//在console中,可见,父类也多出一个showJob方法,此时跟集成概念冲突,这个时候需要对对象进行复制而不是引用,此时可以用for in的方式进行拷贝继承,参见上述第二种继承
浙公网安备 33010602011771号