1. 原型链继承:
function SuperType() {
this.colors=['red','blue','green'];
}
function SubType() {
};
SubType.prototype=new SuperType();
var instance1=new SubType();
instance1.colors.push('black');
console.log(instance1.colors);//["red", "blue", "green", "black"]
var instance2=new SubType();
console.log(instance2.colors);//["red", "blue", "green", "black"]
优势:1.实例是子类的实例,也是父类的实例;2.父类新增原型方法/原型属性,子类都能访问到
缺陷:1.来自原型对象的引用属性是所有实例共享的;2.创建子类实例时,无法向父类构造函数传参
2. 构造函数继承:
function SuperType(name) {
this.name=name;
}
function SubType() {
SuperType.call(this,'Nicholas');
this.age=29;
}
var instance=new SubType();
console.log(instance.name+' '+instance.age);//Nicholas 29
优势:1.解决子类实例共享父类引用属性的问题;2.创建子类实例时,可以向父类传递参数;3.可以实现多继承(call多个父类对象)
缺陷:1.实例并不是父类的实例,只是子类的实例;2.只能继承父类的实例属性和方法,不能继承原型属性/方法;3.无法实现函数复用,每个子类都有父类实例函数的副本,影响性能
3. 组合继承:
function SuperType(name) {
this.name=name;
this.colors=['red','blue','green']
}
SuperType.prototype.sayName=function () {
console.log(this.name);
}
function SubType(name,age) {
SuperType.call(this,name);
this.age=age;
}
SubType.prototype=new SuperType();
SubType.prototype.sayAge=function () {
console.log(this.age);
}
var instance1=new SubType('Nicholas',29);
instance1.colors.push('black');
console.log(instance1.colors);
instance1.sayName();
instance1.sayAge();
var instance2=new SubType('Greg',27);
console.log(instance2.colors);
instance2.sayName();
instance2.sayAge();