继承的目的简单讲就是要使用父类的实例属性或原型属性
// 父类
function Animal(name, color) {
// 实例属性
this.name = name;
this.color = color;
}
// 原型属性
Animal.prototype.getName = function() {
return this.name;
}
// 子类
function Cat() {
xxxxxx
}
原理:在子类的构造函数中调用父类的构造函数
function Cat(name, color) {
// 调用了父类的构造函数,将其中的this指向了子类的实例
Animal.call(this, name, color);
this.xxx = xxx;
}
优点:可以向父类构造函数传参
缺点:只能继承父类的实例属性
原理:将子类原型指向父类的实例
Cat.prototype = new Animal()
Cat.prototype.constructor = Cat;
优点:
缺点:
注意:给子类添加原型方法一定要在
Cat.prototype = new Animal()之后
原理:将子类的原型指向父类的原型
// 这种做法比较激进,弊端很大
Cat.prototype = Animal.prototype;
Cat.prototype.constructor = Cat;
优点:貌似没有什么优点,不推荐使用
缺点:
原理:emmmm,看代码
function extend(Parent) {
function F(){}
F.prototype = Parent.prototype;
return new F();
}
Cat.prototype = extend(Animal);
// 或者 Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;
优点:
和间接原型继承相比,子类的原型是一个空对象,内存占用较少(当然后期也可以加原型属性)
缺点:只能继承原型属性
原理:通过 for-in 将父类上的原型属性复制到子类原型
function extend(Child, Parent) {
var c = Child.prototype;
var p = Child.prototype;
for(var key in p) {
if(!p.hasProperty(key)) return;
c[key] = p[key];
}
}
优点:emmmm...子类在继承前或继承后都可以设置原型属性
缺点:只能继承父类的原型属性,性能较差?
实际上也可以复制父类的实例,从而继承父类的实例属性,不过缺点和间接原型继承一样,父类实例的实例属性被子类实例共享。
原理:构造函数继承 + 间接原型继承
优点:既能继承实例属性,又能继承原型属性
缺点:
原理:构造函数继承 + 空对象媒介
优点:和组合继承相比,这样就不会生成父类实例了,且子类原型是个空对象,开销较小。
只继承实例属性
只继承原型属性
既继承实例属性,又继承原型属性
原文:https://www.cnblogs.com/hueralin/p/12538878.html