javascript的继承及原型链

什么是javascript继承?

继承是OO语言中的一个最为津津乐道的概念。许多OO语言都支持两种继承方式:接口继承和实现继承。接口继承只继承方法签名,而实现继承则继承实际的方法。如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承。ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的。

下面来说一个简单的继承的例子


      function A() {
        this.name = "5se7en"
      }
      A.prototype.getName = function(){
        return this.name
      }
      function B() {
        this.sex = "Sir"
      }
      B.prototype = new A()
      B.prototype.getSex = function(){
        return this.sex
      }
      C = new B()
      console.log(C.getSex()) //Sir
    

问题1:C._proto_指向谁?

首先B是一个构造函数,C是通过B实例化得到的,所以C是B的实例对象,那么根据上图的指向关系C._proto_肯定是指向B的原型对象(B.prototype),在看代码我们B.prototype = new A()通过这个我们又知道了B.prototype其实又是A的实例对象,所以C._proto_其实最终指向的是A的实例对象

问题2:C._proto_._proto_指向谁?

C._proto_._proto_指向的是A的原型对象(A.prototype),这个问题其实就是A的实例对象的_proto_指向谁,由上图可以轻易就能得到结论A的实例对象指向的是A的原型对象(A.prototype),所以C._proto_._proto_指向的是A的原型对象(A.prototype)

问题3:C._proto_._proto_._proto_指向谁?并且最终指向谁?

由问题2可以得知,这个问题转化得到的问题其实就是A的原型对象的_proto_指向谁?其实这个就要说到一个结论了。

在js中万物皆对象,几乎所有 JavaScript 中的对象都是位于原型链顶端的Object的实例,原型对象也有一个自己的原型对象 ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。

未完,待续.....