继承

继承
概念:通过一个类,创建另一个类这样新创建出来的类不仅拥有了原来的属性和方法,而且还可以添加自己独有的属性和方法。实现自定义类的继承 (call)借用构造函数。。

call和apply是function的原型方法。可以用来调用函数他们的第一个参数表示被调函数内部的this指针的指向对象,剩下的参数则是为函数的实参。
apply函数的第二个参数是一个数组。数组表示的实参。

call 调用函数的执行。
通过call函数调用父类函数, 第一个参数是用来修改父类函数中this的指向,把this对象传递进去并执行父类函数,则父类函数中的属性及方法 子类可以继承。
子类不仅可以继承父类的属性和方法。还可以更改属性和方法。

<script type="text/javascript">
 function hello(name,age){
 console.log("hello"+name);
 console.log(age)
 }
 // hello("张三");// 传统的调用方式、
 hello.call("","许三多",12); //call 可以执行函数。
 //第一个参数:内部this的指向。
 //第二个参数:实参
 //apply 可以执行函数
 hello.apply("",["许三多",12]);
 //第一个参数:内部this的指向
 //数组中的值:实参
 </script>

通过call实现 继承的代码:

<script type="text/javascript">
 function Animal(name,age) {
 this.name = name;
 this.age = age;
 this.eat1 = function(){
 console.log("what eat?")
 }
 }
 function Dog(name,age,leg){ //设置形参 接受实参
 Animal.call(this,name,age);//继承了Animal的属性及方法。
 this.leg = leg;
 this.eat1 = function(){
 console.log("喜欢吃骨头");
 }
 this.lookdoor=function(){
 console.log("看门狗");
 }
 }
 var one = new Dog("小黑",3,4);
 console.log("我家的小狗叫:"+one.name+",今年"+one.age+"岁。有"+one.leg+"条腿。");
 one.eat1(); //修改后的方法 喜欢吃骨头
 one.lookdoor(); //看门狗
 </script>```
  组合继承的实现思路:使用call来继承实例属性,使用原型链来继承原型方法
组合继承(包括call和原型链的继承方式):

<script type="text/javascript">
function Animal(name,age) {
this.name = name;
this.age = age;
this.eat1 = function(){
console.log("what eat?")
}
}
Animal.prototype.gender ="男";
Animal.prototype.haha = function(){
console.log("haha");
}
function Dog(name,age,leg){
//使用call来继承实例属性
Animal.call(this,name,age);
this.leg = leg;
this.lookdoor=function(){
console.log("看门狗");
}
}
//使用原型链继承原型方法。
Dog.prototype = new Animal(); //Dog的原型指向Animal;继承了父类。
Dog.prototype.constructor = Dog;//让子类的原型指向子类的构造函数 修正了继承关系
var one = new Dog("小黑",23,4);
var two = new Dog("小白",23,3);
console.log(one.name);
console.log(two.name)
one.eat1();
console.log(one.gender);//原型的链
one.haha();
console.log(one.constructor == Dog)//测试实例对象是是否是子类构造函数所创建的
</script>```
通过冒充实现继承:

 <script type="text/javascript">
 //冒充继承
//注:不能继承父类的原型对象及方法
 function Person(name,age){
 this.name = name;
 this.age = age;
 }
 Person.prototype.gender = "男";
 Person.prototype.run = function(){
 console.log("快走")
 }
 function Student(name,age,hobby){
 //通过冒充实现子类继承父类的方法和属性
 this.newFn = Person; //给this添加一个新的函数 也就是父类
 this.newFn(name,age ); //执行新添加进去的函数,通过this.newFn调用父类,进而修改了父类中的this的指向
 delete this.newFn; // 修改完指针的指向后可以把新添加的方法删掉
            //继续添加新的属性和方法
 this.hobby = hobby;
 this.study = function(){
 console.log("学习");
 }
 }
 var one = new Student("张三",21,"篮球");
 console.log(one.name+";"+one.age+";"+one.hobby);
 one.study();
</script>```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...
    _Dot912阅读 1,447评论 3 12
  • 继承 Javascript中继承都基于两种方式:1.通过原型链继承,通过修改子类原型的指向,使得子类实例通过原型链...
    LeoCong阅读 334评论 0 0
  • 本文先对es6发布之前javascript各种继承实现方式进行深入的分析比较,然后再介绍es6中对类继承的支持以及...
    lazydu阅读 16,723评论 7 44
  • 基于这篇文章的一些名称约定: 上面的约定应该是比较合理的,如果难以理解,可以查看黯羽轻扬:JS学习笔记2_面向对象...
    一直玩编程阅读 535评论 1 7
  • 我愿一辈子做一个小孩 1 我对朋友说我要变得坚强,我能清晰地感觉到靠近现实的距离越来越近。 考砸了,发愤要好好读书...
    笑容面具阅读 637评论 2 7