参考书籍: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此,一次是实现子类原型的类式继承调用一次父类的构造函数,另一次是使用构造函数继承是被调用。