一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
实现继承的方式
一共有7种实现继承的方式
原型链式继承
将父类的实例作为子类的原型;
//定义一个父类型
function Father(name){
this.name=name;
this.say=function(){
console.log(`我是${this.name}`);
}
}
//原型对象方法
Father.prototype.drink=function(drinks){
console.log(`${this.name}在喝${drinks}`);
}
function Son(){}
Son.prototype=new Father();
Son.prototype.name='小明';
var son =new Son();
缺点:创建子类实例时,无法向父类构造函数传参。
构造函数继承
//定义一个父类型
function Father(name){
this.name=name;
this.say=function(){
console.log(`我是${this.name}`);
}
}
//原型对象方法
Father.prototype.drink=function(drinks){
console.log(`${this.name}在喝${drinks}`);
}
function Son(name,age){
Father.call(this,name);
this.age=age;
}
var son =new Son();
实例继承
//定义一个父类型
function Father(name){
this.name=name;
this.say=function(){
console.log(`我是${this.name}`);
}
}
//原型对象方法
Father.prototype.drink=function(drinks){
console.log(`${this.name}在喝${drinks}`);
}
function Son(name,age){
var p=new Father(name);//先创建子类型实例
p.age=age;
return p;
}
var son =new Son();
拷贝继承
无法获取父类不可for in 遍历的方法。
//定义一个父类型
function Father(name){
this.name=name;
this.say=function(){
console.log(`我是${this.name}`);
}
}
//原型对象方法
Father.prototype.drink=function(drinks){
console.log(`${this.name}在喝${drinks}`);
}
function Son(name,age){
var father=new Father(name);//先创建子类型实例
for (var n in father) {
Son.prototype[n]=father[n];
}
this.age=age;
}
var son =new Son();
组合继承
//定义一个父类型
function Father(name){
this.name=name;
this.say=function(){
console.log(`我是${this.name}`);
}
}
//原型对象方法
Father.prototype.drink=function(drinks){
console.log(`${this.name}在喝${drinks}`);
}
function Son(name,age){
Father.call(this,name);
this.age=age;
}
Son.prototype=new Father();
Son.prototype.constructor=Son;
var son =new Son();
寄生组合继承
//定义一个父类型
function Father(name){
this.name=name;
this.say=function(){
console.log(`我是${this.name}`);
}
}
//原型对象方法
Father.prototype.drink=function(drinks){
console.log(`${this.name}在喝${drinks}`);
}
function Son(name,age){
Father.call(this,name);
this.age=age;
}
(function(){
//创建一个没有实例方法的类
var Super=function(){};
Super.prototype=Father.prototype;
//将实例作为子类的原型
Son.prototype=new Super();
})()
var son =new Son();
Es6 class extends继承
Class Father{
constructor(){
}
...
}
Class Son extends Father{
constructor(){
super();
}
}