Javascript面向对象编程--组合继承

参考书籍:JavaScript设计模式
类式继承
https://blog.csdn.net/weixin_44924173/article/details/90911544
构造函数继承
https://blog.csdn.net/weixin_44924173/article/details/91040014

在前面学习到的类式继承和构造函数继承,总结这两种继承的特点。
类式继承是基于原型,通过把父类的实例化赋值给子类的原型,SubClass.prototype = new SuperClass();。构造函数继承是通过在子类的构造函数中执行一次父类的构造函数,

function SubClass(id) {
    SuperClass.call(this, id);//this指向SubClass,下一步去父类,在父类中的this也是指向SubClass
};

而组合继承便是把类式继承和构造函数组合在一起,融合了它们的优点,并且过滤掉它们的缺点。如:

//声明父类
function SuperClass(id) {
    //引用类型的公有属性
    this.books = ['javascript', 'html'];
    //父类公有属性
    this.id = id;
};
//为父类添加公有方法
SuperClass.prototype.showBooks = function () {
    console.log(this.books);
    console.log(this.id);
};
//声明子类
function SubClass(id, time) {
    //构造函数继承父类id属性
    SuperClass.call(this, id);//this指向SubClass,下一步去父类,在父类中的this也是指向SubClass
    //子类中新增的公有属性
    this.time = time;
};
//类式继承:子类原型继承父类
SubClass.prototype = new SuperClass();
//子类原型方法
SubClass.prototype.getTime = function () {
    console.log(this.time);
}
function displayBook() {
    var sub1 = new SubClass(1,2019);
    console.log('sub1 super value: ' + sub1.books);//sub1 super value: java,html
    var sub2 = new SubClass(2,2018);
    sub2.books.push('css');
    console.log('sub1 super value: ' + sub1.books);//sub1 super value: java,html
    console.log('sub2 super value: ' + sub2.books);//sub2 super value: java,html,css
    sub1.showBooks();//["javascript", "html"]  1
    sub1.getTime();//2019
}

这样在子类的一个实例中更改了从父类继承过来的引用类型,如books,不会影响到其他子类,而且在子类实例化过程中可以将参数传递到父类的构造函数中,如id.
但是组合继承并不是完美的,在这个过程中,父类的构造函数被调用了2此,一次是实现子类原型的类式继承调用一次父类的构造函数,另一次是使用构造函数继承是被调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值