发布时间:2023-05-07 18:30
目录
1、原型链继承:将父类的实例作为子类的原型
2、借用构造函数继承:复制父类的实例属性给子类
3、实例继承:为父类实例添加新特性,作为子类实例返回
4、组合继承(原型链继承+借用构造函数继承):可传参、继承原型
5、es6的extends
首先定义一个父类Animal:
//构造函数
function Animal(name) {
this.name = name || \'Animal\';
this.sleep = function() {
console.log(this.name + \'正在睡觉!\');
};
}
//原型上面的方法:
Animal.prototype.eat = function(food) {
console.log(this.name + \'正在吃:\' + food);
}
关键语句:Dog.prototype = new Animal();
显著缺点:无法继承多个;
特点:
缺点:
核心:使用父类的构造函数增强子类实例,等于是复制父类的实例属性给子类(没用到原型)
关键语句:Animal.call(this)
显著缺点:只能继承父类的实例属性和方法,不能继承父类原型属性/方法。故只是子类的实例,不是父类的实例;
特点:
缺点:
关键语句:var instance = new Animal(); return instance;
显著缺点:是父类的实例(因为通过new调用了父类),不是子类的实例
特点:
缺点:
核心:通过调用父类构造函数,继承父类的属性并可传参,然后将父类实例作为子类原型,继承原型属性/方法。
关键语句:Animal.call(this); //构造函数
Cat.prototype = new Animal(); //原型链继承
显著缺点:会调用两次父类的构造函数
特点:
缺点:
注意:
super
内部的this
指的是子类的实例子类的原型 child.prototype 指向父类的原型 father.prototype;
子类原型的构造函数 child.prototype.constructor 指向子类本身 child;
关键语句:
inheritPrototype方法设置子类的原型,使其指向父类的原型,并且构造函数指向子类本身;
father.apply(this,[]) //父类构造函数
特点:
//1. 实现子类继承父类(通用方法)。child类继承father类 。子类的原型指向父类的原型,子类的构造函数指向其本身
function inheritPrototype(child,father){
var prototype = Object.create(father.prototype); // 1)子类原型 指向父类的原型
prototype.constructor = child; // 2) 子类原型的构造函数指向child类。
child.prototype = prototype; // 3)设置子类的原型为prototy。
}
//2. 创建父类
function father(name){
this.faName = \'father\';
}
father.prototype.getfaName = function(){
console.log(this.faName);
}
//3. 创建子类
function child(args){
this.chName = \'child\';
father.apply(this,[]); //借用父类的构造函数,可访问父类本身的方法和属性
}
// 继承父类
inheritPrototype(child,father);
// 子类原型上添加方法
child.prototype.getchName = function(){
console.log(this.chName);
}
//4. 打印测试
let c = new child();
console.log(c.faName); //father
c.getfaName(); //father
console.log(child.prototype.isPrototypeOf(c)); //true。child的实例对象的原型是否是child.prototype
console.log(c instanceof child) //true
console.log(c instanceof father) //true