继承方式有哪些

本文探讨了JavaScript中的四种继承方式:原型链继承、构造函数继承、组合继承(原型链+构造函数)以及寄生组合继承。每种方式各有优缺点,如属性共享、参数传递、多继承和性能优化等。
摘要由CSDN通过智能技术生成

1.原型链继承

//父类
function Parent(name="Parent"){
this.name=name
}
Parent.prototype.getName=function(){
return this.name
}
//子类
function Chiad(){
this.name="Chiad"
}
//继承
Chiad.prototype=new Parent()
const chiad1 = new Chiad('张三');
// 由于原型链继承的方式,无法向父类 Person 传递参数,因此会导致一些问题

缺点:

  • 引用属性共享问题:所有子类实例共享父类原型上的属性和方法,如果一个子类实例修改了继承的属性,会影响其他子类实例,因为它们都指向同一个原型对象。
  • 无法实现多继承:JavaScript 中的原型链继承只能继承一个父类,无法实现多重继承。

2.构造函数继承

function Parent(){
this.name="Parent"
}
Parent.prototype.getName=function(){
return this.name
}
//在构造函数继承
function Chiad(){
Parent.call(this)
this.name="Chiad"
}

优点:

  • 避免了属性共享问题:每个子类实例都拥有自己的属性副本,避免了原型链继承中属性共享的问题。
  • 可以向父类传递参数:子类在实例化时可以向父类构造函数传递参数。
  • 支持多重继承:通过在子类构造函数中调用多个父类构造函数,可以实现多重继承的效果。

缺点:

  • 无法继承父类原型上的属性:子类无法直接访问父类原型,因为只继承了父类的属性并没有继承原型对象。

3.组合继承(原型链继承+构造函数继承)

function Parent(){
this.name="Parent"
}
Parent.prototype.getName=function(){
return this.name
}
//在构造函数继承
function Chiad(){
Parent.call(this)
this.name="Chiad"
}
Chiad.prototype=new Parent()

优点:

  • 原型属性不会被共享
  • 可以继承父类的原型链上的属性和方法

缺点:

  • 调用了俩次父类

4.寄生组合继承

// 定义父类 Person
function Person(name) {
  this.name = name;
}

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}.`);
};

// 定义子类 Student
function Student(name, grade) {
  Person.call(this, name); // 调用父类构造函数,继承属性
  this.grade = grade;
}

// 使用寄生式继承,继承父类的方法
function inheritPrototype(subType, superType) {
  const prototype = Object.create(superType.prototype); // 创建对象,创建父类原型的副本
  prototype.constructor = subType; // 增强对象,修正构造函数指向子类
  subType.prototype = prototype; // 赋值对象,将新创建的对象赋值给子类原型
}

inheritPrototype(Student, Person); // 实现继承

优点:

  • 避免了多次调用父类构造函数:相对于传统的组合继承,寄生组合继承通过寄生式继承来继承父类的原型对象,避免了在子类构造函数中多次调用父类构造函数,从而提高了性能。
  • 共享父类方法:通过将子类的原型指向父类原型的副本,实现了对父类方法的共享,避免了在每个子类实例中都创建一份方法的开销。

缺点:

  • 增加了复杂度:相对于简单的寄生式继承或者原型链继承,寄生组合继承需要借助辅助函数来实现,使得代码结构相对复杂,可读性稍差。
  • 需要额外的辅助函数:实现寄生组合继承需要编写辅助函数 inheritPrototype,这增加了代码量和维护成本。
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值