• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
kikia
博客园    首页    新随笔    联系   管理    订阅  订阅
面向对象的继承1

继承是在原有对象基础上,略作修改,得到一个新的对象,而不影响元有对象的功能。

添加加成的方法:

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的方式进行拷贝继承,参见上述第二种继承
 

posted on 2017-02-23 17:50  gogo0  阅读(195)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3