继承,为了直接复用另一个类型的能力。
实现继承的一些方式:单继承、多重继承、组合(关联)等。
原则上:要多组合、少继承。因为这样避免类型之间的强耦合。

继承层次避免过深,会影响代码的可读性与可维护性。

原型继承的继承链是由实实在在的对象构成的,而类继承系统是通过抽象的类定义(class definition)来进行继承。

在实际应用中,原型继承的一个最大特性就是灵活,因为继承链上的每一个对象、甚至继承链本身都是可以动态修改的。相比之下,类继承需要事先定义好所有的类和它们之间的继承关系,绝大部分类继承系统都不支持在运行时动态修改这些已经定义好的东西。

有些事情在类继承系统里是做不到(或很难做到)的,比如修改原型等于同时修改了所有继承自该原型的对象,将一个原型的属性部分混入另一个原型,甚至是在现有的继承链中插入一个节点,等等。

原型继承的这种灵活性在有些人眼里是优点,在有些人眼里是缺点,因为有人就是喜欢类继承的稳定性(就像有人偏爱静态类型语言一样),因人和项目需求而异了。


原型式继承

使用原型式继承时,并不需要定义类,只需直接创建一个对象即可,这个对象随后可以被其他新的

对象重用,这主要得益于原型链的查找机制,该对象即被称为原型对象。原型对象为其他对象应有的结构提供了一个模型或者说原型,这也是原型式继承这个名称的由来。


JS 原型式继承中读写的不对等性

下面将说明什么是读写的不对等性:

  1. var test = Clone( Author );
  2. test.getName(); // 名称
  3. test.name = '新名称'; //修改属性值.
  4. // 在创建对象原型时是对person对象的引用(F.prototype = superClass),
  5. // 那些我们在创建对象后调用原型中的属性然后修改其值那么原型中的值也应该被修改掉.
  6. //调用基类name属性看其值是否有改变
  7. Person.name; //输出之后 发现关没有改变这是为什么呢?
  8. /*
  9. 在使用字面量来创建对象时对于从原型对象继承而来的成员,其读和写具有内在的不对等性.
  10. 在读取name值时,如果我们还没有直接为实例定义name属性的话,那么所得到的是其原型对象的同名属性值.
  11. 而在写入name的值时,是在为对象定义一个新属性.
  12. */