JavaScript中的三种常用继承方法

本文介绍了JavaScript中的三种主要继承方式:原型链继承、借用构造函数继承和组合继承。原型链继承通过改变函数的原型指向完成,缺点是所有子实例共享父实例的属性。借用构造函数继承避免了属性共享问题,但无法继承原型属性。组合继承结合两者优点,既能传参又能继承原型。最后提到了使用call向父函数传参的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.原型链继承

2.借用构造函数继承(继承属性)

3.组合继承

4.使用call或apply向父函数中传参


 


1.原型链继承

固定格式

子函数.prototype=new 父函数();

原理:通过改变一个函数的原型指向来完成的继承

优点:暂无(2021.2.18)

缺点

  1. 因为所有子函数的实例都共用同一个父类实例,所以如果一处子函数实例对象修改父函数属性的值,那么其他子函数实例的内容也通过会被修改
  2. 创建子类型函数实例时,不能像父函数传递参数

示例代码

//Humans是父函数,Mans是子函数

function Humans(){
    this.foot=2;
}

Humans.prototype.getFoot=function(){
    alert(this.foot);
}

function Mans(){
    this.head=3;
}

Mans.prototype=new Humans();        //Mans继承Humans

Mans.prototype.getHead=function(){    //注意向子类原型中添加属性或方法要写在继承语句之后   
    alert(this.head);
}

var man1=new Mans();
man1.getFoot();
man1.getHead();

 

2.借用构造函数继承(继承属性)

在子函数内部使用apply或者call完成构造函数继承

固定格式

//语法卸载子函数函数体内

//使用apply
父函数.apply(this);

//使用call
父函数.call(this);

原理:此继承相当于把父函数函数体内的属性或方法拷贝了一份副本给子函数的实例使用

优点:子函数实例不共用同一个父函数的属性或方法,修改一处不会导致全局被修改,可以向父函数传参(2021.2.18)

缺点:只能继承父函数函数体内的属性或方法,无法继承原型中的任何东西

示例代码

//Humans是父函数,Mans是子函数

function Humans(){
    this.foot=2;
}

Humans.prototype.getFoot=function(){
    alert(this.foot);
}

function Mans(){
    this.head=3;
    Humans.call(this);
}

Mans.prototype.getHead=function(){    //注意向子类原型中添加属性或方法要写在继承语句之后   
    alert(this.head);
}

var man1=new Mans();

alert(man1.foot);
alert(man1.head);

 

3.组合继承

使用原型链继承借用构造函数继承实现组合继承

固定格式

//语法写在子函数函数体内

//使用apply
父函数.apply(this);

//使用call
父函数.call(this);



//原型链继承
子函数.prototype=new 父函数();

原理:借用构造函数继承父函数函数体内的东西,原型链继承父函数原型中的东西(弥补了结构构造函数的缺点)

优点:子函数实例不共用同一个父函数的属性或方法,修改一处不会导致全局被修改,可以向父函数传参,同时子函数又继承父函数的原型(2021.2.18)

缺点:暂无

示例代码

//Humans是父函数,Mans是子函数

function Humans(){
    this.foot=2;
}

Humans.prototype.getFoot=function(){
    alert(this.foot);
}

function Mans(){
    this.head=3;
    Humans.call(this);        //继承属性
}

Mans.prototype=new Humans();  //继承原型

Mans.prototype.getHead=function(){    //注意向子类原型中添加属性或方法要写在继承语句之后   
    alert(this.head);
}



var man1=new Mans();

alert(man1.foot);
alert(man1.head);
man1.getFoot();

 

4.使用call向父函数中传参

固定格式

//参数传递的顺序和父函数()中参数的顺序一致
父函数.call(this,参数1,参数2....)

示例代码

//Humans是父函数,Mans是子函数

function Humans(foot){    //注意,此时()里的foot和函数体内的foot不是一个foot
    this.foot=foot;    //this.foot=参数foot
}

Humans.prototype.getFoot=function(){
    alert(this.foot);
}

function Mans(){
    this.head=3;
    Humans.call(this,2);        //继承属性
}

Mans.prototype=new Humans();  //继承原型

Mans.prototype.getHead=function(){    //注意向子类原型中添加属性或方法要写在继承语句之后   
    alert(this.head);
}



var man1=new Mans();

alert(man1.foot);
alert(man1.head);
man1.getFoot();

声明:所有内容均为个人理解总结,如理解有误请及时纠正我的错误,以免误人子弟,谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾欲乘风归去,又恐琼楼玉宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值