对象属性继承
-
原型继承
- 实现方式: 将子类构造函数的原型 指向 父类构造函数的实例对象
+ 改变了子类构造函数的原型指向实现继承
+ 则子类构造函数实例对象 的原型指向 也发生变化了
- 优点:
+ 实现了属性和方法的继承
- 缺点:
+ 继承的属性不在子类的实例中,在原型中
+ 子类 没有自己的原型了 -
借用继承(借用构造函数继承/借用call继承)
- 在子类构造函数中,将父类构造函数当做普通函数通过call方法调用执行 来实现继承
+ 构造函数 也是函数,函数通过call方法调用执行会改变函数内的this指向
- 优点:
+ 继承的属性在实例身上
- 缺点:
+ 继承不到父类的方法(原型中的内容) -
组合继承
+ 借用继承 + 原型继承
+ 优点
- 继承的属性在 实例中
- 方法继承到了
+ 缺点:
- 没有自己的原型
+ 子类添加方法属性的时候 是添加到父类构造函数的实例中
- 多了一套属性 -
拷贝继承
- 利用for-in遍历父类构造函数的实例 添加到子类的原型中
- 优点:
- 属性方法都继承
- 缺点:
- 继承的属性不在实例本身
-in 关键字
- 语法: 字符串 in 对象
- 结果: 布尔值
+ 判断字符串 是否在对象中 作为属性
- 特点: 不仅会在对象本身比较,还会到原型中比较 -
寄生式继承
+ 就是对继承对象的进一步封装拓展。
inHeritObject(o) {
// 创建一个过渡对象
function F() {}
// 将父类对象的给过渡对象的原型对象上
F.prototype = o;
// 返回新的实例化对象
return new F();
},
// 寄生式继承
parasiticObject(o) {
const obj = this.inHeritObject(o);
obj.getName = function() {
console.log(this.name);
}
return obj;
}
- ES6 中的类有指定的继承语法
- 语法
- 在子类定义的时候
class 子类 extends 父类{
constructor(){
super(参数)
}
}
- 注意:
+ 子类继承是必须 使用extends和super一起使用才可以实现完美继承
+ 在子类的constructor方法中 给实例添加属性只能在 super()之后添加
+ ES6中的类可以通过此语法 继承ES5中的构造函数