JS实现继承的几种方式

定义一个父类
function Father(name){
	// 属性
	this.name = name || 'father';
	// 实例方法
	this.sayName = function(){
		console.log(this.name);
	}
}
// 实例原型方法
Father.prototype.age = 18;
Fatcher.prototype.sayAage = function(){
	console.log(this.age);
}
一、原型链继承

将父类的实例作为子类的原型

function Son(){
	
}
Son.prototype = new Father();
Son.prototype.constructor = Son;

优点:

  • 简单易操作
  • 父类新增的方法或属性子类都能接收到

缺点:

  • 没有办法像父类传参
  • 无法实现多继承
  • 所有的子类的实例原型都共享同一个超类的属性和方法
二、构造继承
function Son(name){
	Father.call(this, '要向父类传递的参数');
	this.name = name || 'son';
}

优点:

  • 继承父类的属性和方法,能够像父类传递参数
  • 解决了所有子类实例共享父类属性引用问题
  • 可以实现多继承

缺点:

  • 无法继承父类原型上的属性和方法
三、组合继承

结合原型链继承和构造继承

function Son(name){
	Father.call(this, '要向父类传递的参数');
	this.name = name || 'son';
}
Son.prototype = new Father();
Son.prototype.constructor = Son;

优点:

  • 解决了原型链继承和构造继承缺点

缺点:

  • 调用了两次父类构造函数,生成了两份实例,只是子类的属性覆盖了超类的属性
四、原型式继承
function createObj(obj){
	function f(){};
	f.prototype = obj;
	return new f();
}

优点:
直接通过继承一个对象生成一个对象
缺点:
不是类式继承,而是原型式基础

五、寄生式继承
function createObj(obj){
	function f(){};
	f.prototype = obj;
	return new f();
}
function cloneObj(cloneObj){
	const f = createObj(cloneObj);
	f.prototype = '...要给当前函数赋值的属性或方法';
	return f;
}

就是原型式继承的一种扩展

六、寄生组合式继承

通过寄生方式,砍掉父类的实例属性,避免了组合继承生成两份实例的缺点

function Son(name){
	Father.call(this, '要向父类传递的参数');
	this.name = name || 'son';
}
Son.prototype = Object.create(Father.prototype);
Son.prototype.cunstructor = Son;

优点:
比较完美
缺点:
不通过Object.create()方法实现起来会很复杂

七、ES6–class继承
class Son extend Father {
	constructor(name){
		super(name);
		this.name = name || 'son';
	}
}

使用 class + extend 实现继承

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值