JS面向对象-继承
本篇主要是「JavaScript高级程序设计-面向对象的程序设计」一章中第三篇「继承」回顾的笔记
原型链
-
备注
- 实现继承的主要方式
- 利用原型让一个引用继承类型继承另一个引用类型的属性和方法
-
示例
function SuperType() { this.property = true; } SuperType.prototype.getSuperValue = function() { return this.propety; } function SubType() { this.subproperty = false; } SubType.prototype = new SuperType(); SubType.prototype.getSubValue = function() { return this.subproperty }
var instance = new SubType();
alert(instance.getSuperValue()); // true
## 借用构造函数
1. 基本思想
* 在子类型构造函数内部调用超类型构造函数
2. 示例
```javascript
function SuperType() {
this.colors = ['red', 'blue', 'green']
}
function SubType() {
// 继承SuperType
SuperType.call(this);
}
var instance = new SubType();
instance.colors.push('black');
alert(instance.colors); // "red, blur, green, black"
组合继承
-
概念
- 指的是将原型链和借用构造函数的技术组合到一块,发挥二者之长
-
思路
- 使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承
-
示例
function SuperType(name) { this.name = name; this.colors = ['red', 'blue', 'green'] } SuperType.prototype.sayName = function() { alert(this.name); } function SubType(name, age) { // 继承属性 SuperType.call(this, name); this.age = age; } // 继承方法 SubType.prototype = new SuperType(); Subtype.prototype.constructor = SubType; Subtype.prototype.sayAge = function() { alert(this.age); }; var instance = new SubType('Matthew', 27); instance.colors.push('black'); alert(instance.colors); // red, blue, green, black instance.sayName(); // Matthew instance.sayAge(); // 27
原型式继承
-
备注
- 没有严格意义上的构造函数
- 基于已有的对象创建对象,同时不必因此创建自定义类型
-
示例
function object(o) { function F() {}; F.prototype = o; return new F(); } var person = { name: 'Matthew', friends: ['Wudan', 'Sanmao', 'MaP'] }; var anotherPerson = object(person); anotherPerson.name = 'BLSM'; anotherPerson.friends.push('YQS'); alert(person.friends); // 'Wudan', 'Sanmao', 'MaP', 'YQS'
寄生式继承
-
备注
- 创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真的是它做了所有工作一样返回对象
-
示例
function object(o) { function F() {}; F.prototype = o; return new F(); } function createAnother(original) { var clone = object(original); clone.sayHi = function() { alert('hi'); } return clone; } var person = { name: 'Matthew', friends: ['Wudan', 'Sanmao', 'MaP'] }; var anotherPerson = createAnother(person); anotherPerson.sayHi(); // hi
寄生组合式继承
-
备注
- 借用构造函数来继承属性,通过原型链的混成形式来继承方法
- 不必为了指定子类型的原型而调用超类型的构造函数,我们所需要的无非是超类型原型的一个副本而已
-
示例
function inheritPrototype(subType, superType) { var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function SuperType(name) { this.name = name; this.colors = ['red', 'blue', 'green']; } SuperType.prototype.sayName = function() { alert(this.name); } function SubType(name, age) { SuperType.call(this, name); this.age = age; } inheritPrototype(SubType, SuperType); SubTyper.prototype.sayAge = function() { alert(this.age); }