原型、构造函数、实例的关系
2017-03-15 本文已影响124人
David三人行
首先涉及到原型的概念,什么叫原型呢?每个函数在创建的时候,都会有一个prototype属性,该属性指向了一个对象,这个对象我们就叫做原型对象。
原型有什么作用呢?它能够解决实例对象的属性、方法共享问题。
在提到原型时,我们总会提到构造函数、实例,那么三者的关系是什么呢?
每个函数在创建时都会有一个prototype属性,该属性指向函数的原型对象。而函数的原型对象有一个constructor属性,该属性指向构造函数。至此,两者之间互有联系。
而在利用构造函数创建对象时,我们用到了关键字new。具体可以看我其中一篇博文。它实际上做了以下操作:
1.动态创建对象
2.把this对象指向新创建的对象
3.把对象的__proto__属性指向对象的prototype
4.返回对象
在创建对象时,实例对象会有一个constructor指向构造函数。除此之外,在每个实例中都有一个Symbol对象的属性[[Prototype]],它无法直接被访问,但是在Firefox、Safari和Chrome中,每个实例对象可以通过proto属性访问到实例的原型对象。至此,三者互有关联。
那原型是如何实现实例间的属性、方法共享呢?
在访问实例对象的方法或者属性时,首先根据标志符会在实例中寻找,当找到该标志符时,返回对应的属性或者方法。当找不到时,它会去寻找实例对象的原型中查找,如果找到,则返回值。否则,返回undefined(实际上还会沿着原型的原型查找,直至Object对象。这就涉及到继承了)。
当为对象添加属性时,我们再去访问这个属性。就会在实例对象中找到该属性值,从而不会到原型对象中查找。
然而在删除属性值时,只会删除实例对象的相应属性,而不会在找不到属性的情况下,删除了原型对象的同名属性。