# 面向对象&继承

-创建对象的方式

# 继承

继承是 oo 语言中的一个最为人津津乐道的概念。许多 oo 语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。由于 js 中方法没有签名,在 EMACScript 只支持实现继承,而且其实现继承是依靠原型链来继承的。

# 构造函数、原型和实例的关系:

每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。

function Father() {
  this.property = true;
}
Father.prototype.getFatherValue = function() {
  return this.property;
};
function Son() {
  this.sonProperty = false;
}
//继承 Father
Son.prototype = new Father(); //Son.prototype被重写,导致Son.prototype.constructor也一同被重写
Son.prototype.getSonVaule = function() {
  return this.sonProperty;
};
var instance = new Son();
alert(instance.getFatherValue()); //true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

但是需要注意的是:原型链并非十分完美,会存在以下问题:

  • 当原型链中包含引用类型值的原型时,该引用类型值会被所有实例共享
  • 在创建子类型时,不能想超类型的构造函数中传递参数

所以在实践中,很多会单独使用原型链。从而出现了一些弥补方案:

  • 借用构造函数继承
  • 组合继承
  • 原型继承
  • 寄生式继承
  • 寄生组合式继承