Javascript原型链

原型链的继承就是将子类的prototype.__proto__链接到父类的prototype,借此完成原型链

1
child.prototype.__proto__.= parent.prototype

实例化的对象没有prototype,prototype是函数特有的属性,所有的对象都有__proto__, 这是指向实例化这个对象的类的prototype,所有对象的原型链最后是null

下面是经典的原型链继承的例子,我借此解释一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  function extend(Child, Parent) {
    var F = function(){};
    //将父类的prototype复制到F函数中
    F.prototype = Parent.prototype;
    /*new F()实例化F()实际的作用是生成了一个下面这个对象
    {
   __proto__: {
   //Parent.prototype
   }
    }
    这样就完成了
    Child.prototype.__proto__ = Parent.prototype这个原型链继承的核心内容
    */
    Child.prototype = new F();
    //Parent.prototype的constructor是Parent,为了准确这里要手动将Child.prototype.constructor改为Child
    Child.prototype.constructor = Child;
    //这里是为了代码实际开发时方便调用父类,不用使用__proto__
    Child.uber = Parent.prototype;
  }

涉及到继承这一块,Javascript 只有一种结构,那就是:对象。在 javaScript 中,每个对象都有一个指向它的原型(prototype)对象的内部链接。这个原型对象又有自己的原型,直到某个对象的原型为 null 为止(也就是不再有原型指向),组成这条链的最后一环。这种一级一级的链结构就称为原型链(prototype chain)。—MDN原型链描述

上面这句话有些长,看代码获取会直观一点

1
2
3
4
5
childClass.prototype.__proto__ == parantClass.prototype

childInstance.__proto__ == childClass.prototype

childInstance.__proto__.__proto__ == childClass.prototype.prototype == parantClass.prototype

对于这里的childInstance.__proto__ == childClass.prototype,是由关键字new实现的,具体可以看我的另外一篇文章new到底做了什么

参考文献
Javascript继承机制的设计思想
Javascript面向对象编程(二):构造函数的继承
继承与原型链