可以实现继承的几种方式

继承的几种方式

说起继承,又是一个老生常谈的问题了。今天来讲讲继承的几种方法以及他们的优缺点吧。

源码地址:点击这里

一、原型链继承

原型链继承:通过原型将一个引用类型继承另一个引用类型的属性和方法。

// 构建一个父类
function Parants (){
   
	this.name = 'zs',
	this.age = 18
	this.hubby = {
   
	study: 'js',
	read: '西游记'
	}
}
// 定义方法
Parants.prototype.getHubby = function () {
   
	console.log(this.name)
	console.log(this.hubby)
}
 
 // 构造子类
function Child() {
   }
// 子类的原型继承父类
Child.prototype = new Parent()

// 以子类原型创建一个新的实例
let Child1 = new Child()
Child1.hubby.song = 'like'
Child1.getHubby ()  // {study: 'js', read: '西游记', song: 'like'}

let Child2 = new Child()
Child2.getHubby ()  // {study: 'js', read: '西游记', song: 'like'}

// 可以看到这里 Child2,并没有去修改 Params的属性
// 但是打印数据不是原始数据,而是 Child1 修改之后的数据
总结优点:
  1. 父类的方法可以复用
缺点:
  1. 父类所有的引用属性(hubby),会被所有的子类共享,其中一个子类修改引用属性,其他的子类也会受到影响
  2. 子类型实例不能给父类型构造函数进行传参

二、借用构造函数继承

借用构造函数继承:在子类构造函数内部调用超类型构造函数。 通过使用 apply() 和 call() 方法可以在新创建的子类对象上执行构造函数。

// 构建父类
function Parants (){
   
	this.hubby = {
   
	study: 'js',
	read: '西游记'
	}
}
// 构建子类,使用 call 把父类的 this 指向子类
function Child() {
    
	Parants.call(this) 
}
// 利用子类创建一个新的实例
let child1 = new Child()
child1.hubby.song = 'like'
console.log(child1.hubby) // {study: 'js', read: '西游记', song: 'like'}

let child2 = new Child()
console.log(child2.hubby) // {study: 'js', read: '西游记'}
// 这里可以看到,就算child1 修改了属性,child2 也不会受到影响

这里使用 call() 或者是 apply()的方法重新执行上下文,就相当于是这个新的 Child 实例对象上面重新执行了Parant 构造函数中的所有代码,就相当于是每一个利用 Child 构造函数来创建的对象都有自己的 hubby 方法,实例之间互不影响。

关于传参

相比于原型链继承,借用构造函数有一个优点,那就是可以在子类构造函数中向父类构造函数进行传参。

// 构造父类
function Parant (name) {
   
// name:用来接收传过来的参数
	
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值