一、原型链
- 基本构想:通过原型继承多个引用类型的属性和方法。
- 构造函数、实例、原型三者之间的关系
- 每个构造函数都有一个原型对象(prototype),原型对象有一个属性(constructor)指回构造函数,而实例对象有一个内部指针(proto 隐式原型) 指向原型对象。下面来看一个例子
-> 从上面例子我们可以清楚原型搜索机制:在读取实例上的属性时,首先会在实例上搜索这个属性。如果没找到,则会继承搜索实例的原型。在通过原型链实现继承之后,搜索就可以继承向上,搜索原型的原型。
- 默认情况下,所有引用类型都继承于Object。
- 判断原型和继承之间关系
- instanceof:,如果一个实例的原型链中出现过相应的构造函数,则 instanceof 返回 true。
- isPrototypeOf: 判断原型链中是否包含这个原型,返回true/false值
- 方法的重写
//后面定义的方法覆盖前面(正确姿势)
SubType.prototype.getSuperStatus = function() {
return true
}
–>若是以对象字面量的形式创建原型方法的话,会破坏原型链,因为这相当于重写了原型链。
6. 原型链的两个问题
1)原型中包含的引用值会在所有实例间共享,会相互污染。
2)实例化的时候,不能往构造函数中传参。
二、盗用构造函数
-
用途:用来解决原型中引用类型相互污染
-
方法:在子类构造函数中调用父类构造函数
-
优点:相对于原型链来说,可以传递参数
-
缺点
1)函数不能重用。因为必须在构造函数中定义方法
2)子类构造函数不能访问父类构造函数原型上的方法
三、组合继承(结合一和二的优点)
- 实现思路:使用原型链继承原型上的方法和属性,使用盗用构造函数继承实例属性。
- 总结:组合继承弥补了原型链和盗用构造函数的不足,是 JavaScript 中使用最多的继承模式。而且组合继承也保留了 instanceof 操作符和 isPrototypeOf()方法识别合成对象的能力。
四、原型式继承
- 出发点:即使不自定义类型也可以通过原型实现对象之间的信息共享
- 适用情况:有一个对象,想在它的基础上再创建一个新对象。你需要把这个对象先传给 object(),然后再对返回的对象进行适当修改。但是同样的,属性中包含的引用类型数据会在相关对象间共享,这点跟原型模式一样。
- 通过Object.create(参数1, 参数2(可选)) 来实现
- 参数1:作为新对象原型的对象
- 参数2:给新对象额外定义属性的对象
五、寄生式继承
- 基本概念:创建一个实现继承的函数,以某种方式增强对象,然后返回这个对象。
- 缺点:给对象添加函数的话,会导致函数难以复用。