继承
NO.1 原型链
基本思想是让一个引用类型继承另一个引用类型的属性和方法。所以原型链是用来实现继承的主要方法。
继承的实现主要原理,其实本质方法是重写原型对象。例如:
假设要B继承A的所有属性和方法。
首先定义一个构造函数A和构造函数B
然后:
B.prototype = new A()
var aa = new B()
这样一来aa就继承了对象A的所有方法和属性。
注意:所有的函数默认原型都是Object实例,所以构造函数A也继承了Object的所有方法和属性。
NO.2 重写超类型中的方法:
值得注意的是,在通过原型链实现继承时,不能使用对象字面量创建原型方法。因为这样写就会重写原型链。
以上的例子存在一个问题就是:通过以上函数创建的对象属性都是共享的,且都是原型对象中的属性,这样一来, 只要有一个对象实例改变了属性,其他的对象实例都会发生改变。所以需要用到借用构造函数方式:
NO.3 组合继承
简单来说,就是用构造函数的方式继承所有属性,然后方法自己通过原型对象来创建。代码如下:
NO.4 原型式继承
通俗来讲,就是借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。如下:
function object(o){
function F(){}
F.prototype = o ;
return new F();
}
```
主要原理也是重写构造函数的原型。在函数内部,临时新建一个构造函数,然后重写构造函数的原型(将传入的对象赋值进去),然后返回这个构造函数的新实例。
![](http://upload-images.jianshu.io/upload_images/627120-9289fb2be2dea1d9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Object.create(),在传入一个参数的情况下,和object()方法的行为相同。
在传入2个参数的情况下,后面的那个参数代表属性,如果和原型对象属性重名,会覆盖原型对象里的属性
####NO.6 寄生式继承
![](http://upload-images.jianshu.io/upload_images/627120-86a8068a2c900ecb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/627120-576269860af3deba.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
####NO.7寄生组合式继承
寄生组合式继承基本模式如下:
![](http://upload-images.jianshu.io/upload_images/627120-18ce4b2740724ab2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
实例:
![](http://upload-images.jianshu.io/upload_images/627120-02d26387cf321986.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)