什么是继承
一个类(函数)可以重用另另一个类(函数)的属性和方法
1.原型链继承
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function() {
return this.property;
}
function SubType() {
this.subproperty = false;
}
// 这里是关键,创建SuperType的实例,并将该实例赋值给SubType.prototype
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function() {
return this.subproperty;
}
var instance = new SubType();
console.log(instance.getSuperValue()); // true
缺点
- 子类多个实例的__proto__属性都是指向同一个对象
- 无法继承父类的静态方法
2.寄生组合
function Parent() {
this.favorite = [1]
function Child() {
Parent.call(this) // 继承父类的--属性,
this.age = 18
Child.prototype = Object.create(Parent.prototype) // 继承父类的原型属性
Object.setPrototypeOf(Child, Parent) // 继承父类的---静态方法(方法共享没事)
Child.prototype.constructor = Child // constructor 重新指向 Child
ES6原生写法
function _inherits(subType, superType) {
// 创建对象,创建父类原型的一个副本
// 增强对象,弥补因重写原型而失去的默认的constructor 属性
// 指定对象,将新创建的对象赋值给子类的原型
subType.prototype = Object.create(superType && superType.prototype, {
constructor: {
value: subType, // 值
writable: true, // 可以改变值,默认是不可以改变
enumerable: false, // 该属性不会出现在对象的枚举属性中。
configurable: true // 该属性的描述符可以改变,同时该属性也能从对应的对象上被删除。
}
});
if (superType) {
Object.setPrototypeOf
? Object.setPrototypeOf(subType, superType)
: subType.__proto__ = superType;
}
}