JS继承的6种方式

JS继承:
1、原型链继承
Person.prototype = new Animal();
将父类的实例作为子类的原型。
(1)不能向构造函数传参,无法实现多继承
(2)来自原型对象的引用属性是所有实例共享的

2、构造继承
实际上使用父类的构造函数来增强子类,等于是把父类的构造函数复制给子类。
function Person(name) {
Animal.call(this);
this.name = name;
}
优点:
(1)可以向构造函数传参数
(2)可以实现多继承,多call几个
缺点:
(1)无法实现函数复用
(2)只能继承父类的属性和方法,不能继承父类的原型

3、实例继承
为父类实例添加新属性,作为子类实例返回。
function Cat(name) {
var instance = new Animal();
instance.name = name;
return instance;
}
缺点:无法实现多继承

4、拷贝继承
function Cat(name) {
var animal = new Animal();
for (var attr in animal) {
Cat.prototype[attr] = animal[attr];
}
this.name = name;
}
优点:支持多继承
缺点:占用内存高,因为要用for in循环来拷贝父类属性/方法
不可枚举方法拷贝不了

5、组合继承
通过调用父类构造函数,继承了父类的属性,并保留了传参的优点。然后再将父类实例作为子类原型,实现了函数复用。
function Cat(name) {
Animal.call(this);
this.name = name;
}
Cat.prototype = new Animal();
Cat.constructor = Cat;
优点:
(1)继承父类的属性和方法,也继承了父类的原型
(2)可传参,函数可复用
缺点:调用了两次父类构造函数


6、寄生组合继承
通过寄生的方式,去掉了父类的实例属性,在调用父类构造函数时,就不会初始化两次实例方法,避免了组合继承的缺点
function Cat(name) {
Animal.call(this);
this.name = name;
}
(function() {
var Super = function(){};
Super.prototype = Animal.prototype;
Cat.prototype = new Super();
Cat.constructor = Cat;
})();

转载于:https://www.cnblogs.com/SUHONG/p/8777853.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值