JS继承

继承:是类与类之间的一种关系,js中没有类,通过构造函数来模拟类

首先定义一个“人”类

function Person(name,age){
        this.name=name;
        this.age=age;
    }
  //使用原型可以实现数据共享 Person.prototype.eat
=function(){ console.log("吃"); }

定义一个“学生”类

 function Stu(sex){
         this.sex=sex;
     }

一.借用构造函数实现继承(构造函数绑定)

  使用call或apply方法,将父对象的构造函数绑定在子对象上:  

function Stu(sex,name,age){
         Person.call(this,name,age);
         this.sex=sex;
     }
     //实例化对象
       var stu1=new Stu("女","小花",20); 
        console.log(stu1.sex,stu1.name,stu1.age);//女,小花,20
        stu1.eat(); //say is not a function
 

  但是这种方法只能实现属性上的继承,原型方法不能继承。

二.改变prototype指向实现继承 

         Stu.prototype=new Person();
       Stu.prototype.constructor=Stu;
         //实例化对象
       var stu1=new Stu("女","小花",20); 
         console.log(stu1.sex,stu1.name,stu1.age);//女,小花,20
         stu1.eat(); //

  第一行是改变原型指向的意思:

   Stu.prototype=new Person();

  第二行是什么意思呢?

   Stu.prototype.constructor=Stu;

  任何一个prototype对象都有一个constructor属性,指向它的构造函数,

  当原型指向发生改变,Stu.prototype.constructor的指向也将发生改变,指向了Person,

  我们需要手动纠正,避免继承链的紊乱。

  改变原型指向的缺点就是实例化多个对象,他们继承过来的属性值一样。

三.寄生组合继承(常用的经典继承方式)

  

function Stu(sex){
   Person.call(this,name,age);
}
Stu.prototype=new Person();
Stu.prototype.constructor=Stu;

  通过改变原型指向+借用构造函数的方式-----既可以实现方法的继承,也可以实现属性值的不同;

四.拷贝继承

  就是把他爸的东西复制一份给自己 

for(var key in Person.prototype){
    Stu.prototype[key]=Person.prototypr[key];       
}

  

原文地址:https://www.cnblogs.com/qyuan/p/9764077.html