原型与原型链之间一些奥秘

  什么是原型?

    其实我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象就            是原型对象。这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。

    每一个对象都有一个默认的原型。原型本身就是对象。这个对象也有原型。

 

 型属性和实例属性

 

     实例属性

 

      1、构造函数通过this关键字定义的属性

 

      2、构造函数通过var关键字定义的属性

 

      3、对象动态添加的属性

 

    原型属性

 

      构造函数的原型对象添加的属性

 

  原型链是什么?

      原型链就是当从一个对象那里调取属性或方法时,如果该对象自身不存在这样的属性或方法,       就会去自己关联的prototype对象那里寻找,如果prototype没有,就会去prototype关联的前辈         prototype那里寻找,如果再没有则继续查找 Prototype.Prototype引用的对象,依次类推,直到       Prototype.….Prototype为undefined(Object的Prototype就是undefined)从而形成了所谓           的“原型链”。

     为了更好地理解原型链,我为大家画了以下一图,望能帮助大家:

 

 

  原型链和构造函数

 

       JavaScript是一种面向对象的语言,并且可以进行原型继承

 

    JavaScript中的函数有一个属性prototype,这个prototype属性是一个对象,它的一个属       性constructor引用该函数自身。即:

 

  
func.prototype.constructor === Person; // ==> true  

 

 

      这个属性有什么用呢?我们知道一个,一个函数使用new操作符调用时,会作为构造函数返回一个      新 的对象。这个对象的_proto_属性引用其构造函数的prototype属性

 

     因此这个就不难理解了:

 

var obj = new Person();

obj.constructor == Person; // ==> true

 

 

     还有这个:

 

obj instanceof Person; // ==> true  

 

 

  也是通过查找原型链上的constructor属性实现的。

 

  构造函数生成的不同实例的_proto_属性是对同一个prototype对象的引用。所以修改prototype对象会影响所有的实例。



 

posted @ 2017-06-09 19:40  那一刻~~~掩护你  阅读(236)  评论(0)    收藏  举报