原型链的本质论

1.1 原型链的内部属性

   1.1.1.Prototype

      Prototype属性表示该类的父类的原型对象,一般可以用属性_proto_来访问(IE不支持)。

   1.1.2.Class

     Class属性表示类名,是一个字符串。

   例如:

     Object类:

         {

            Prototype:null,

            Class:"Object"

         }

      因为Object类为跟类,他没有父类,所以Prototype属性为空。

      其他类js类如果没有继承其他js类它的Prototype属性应该为Object原型对象。

1.2 prototype的作用——原型链的实现

    1.2.1.实现继承

       function Person(){}

       function Student(){}

      他们的内部属性定义为:

     Person: {

        Prototype:Object的原型对象,

         Class:"Person" 

     }

     Student: {

        Prototype:Object的原型对象,

         Class:"Student" 

     }

    现在使 Student.prototype = new Person();

   

     Student: {

        Prototype:Person的原型对象,

         Class:"Student" 

     }

     这样就实现了继承。 

1.2.2 分享属性和方法

    在创建一个类的实例时,该实例隐式地包含有对自身原型对象的引用。因此,实例中也包含内部属性Prototype的定义。

     function Person {

        this.name = "";

        this.age = 0;

    }

    function Man {

      this.length = 0

    }

    function Student {

      this.level = ""

  }

  Man.prototype = new Person();

  Student.prototype = new Man();

 那么在实例化Person时,这个实例隐式地包含有自身内部属性Prototype的值,该值包含有Person类属性的描述;同样的,在实例化Man时,这个实例也包含内部属性Prototype的值,值也包含Man的属性描述;同样,Student类也一样。

    如果Student的实例调用一个属性,那么它会按照下面的步骤:

   1.在Student中查找这个属性,若存在,则返回,否则查找Protoype属性值,查到是Man的实例。

   2.在Man中查找这个属性,若存在,则返回,否则查找Protoype属性值,查到是Person的实例。

   3.在Person中查找这个属性,若存在,则返回,否则查找Protoype属性值,查到是Object的实例。

   4.在Object中查找这个属性,若存在,则返回,否则返回undefined。

原文地址:https://www.cnblogs.com/ai3xiaoyi/p/3439862.html