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]; }