JS-原型对象、原型链和继承

1、原型对象(重点!!!)

在JavaScript中,我们每创建一个函数,它就会自动创建一个该函数对象的原型对象,该函数对象通过prototype属性指向这个原型对象,而原型对象通过constructor指向函数对象。通过函数可以new出来无数多个实例对象,这些实例对象都通过__proto__属性指向同一个原型对象。具体关系如下图:

                       JS-原型对象、原型链和继承_第1张图片

我们知道,Object也是一个函数,Object也通过prototype指向它的原型对象,该原型对象通过constructor指向Object函数对象,所有通过new Object()构建出来的实例对象也通过__proto__指向Object的原型对。Object它非常特殊,所有的对象都是Object的实例,所以我们自己构建的函数的原型对象其实也有一个__proto__属性,它指向了Object的原型对象,Object原型对象是原型链的顶端了,它的__proto__指向了null,具体关系如下图:

       JS-原型对象、原型链和继承_第2张图片

JavaScript里还有一个特殊的函数叫Function,可以称作是所有函数的爸爸,所有的函数都是它的实例,Object本身也是个函数,而任何函数都是Function的实例对象,所以上面还不是最终的完整原型链。JavaScript里万物皆对象,任何一个对象内部都有一个__proto__属性,Object函数对象和我们自己构造的函数对象的__proto__其实都指向了Function的原型对象,而所有的对象都是Object的实例,所以Function的原型对象也指向了Object的原型对象,Function很特殊,它的__proto__和prototype都指向的是它自己的原型对象,所以最终完整的原型链应该是下面这个样子的:

            JS-原型对象、原型链和继承_第3张图片

如果我们访问某个对象的某个属性,它会先去对象本身去找,如果找到了,则返回该属性的值,如果没找到,则到该对象的__proto__属性指向的原型对象去找,如果找到则返回,如果还没找到,则要沿着原型链继续向上去寻找,最终到达Object的原型对象去找,如果Object原型对象还没有,那就找不到了,因为这时已经到达原型链的顶点了。

2、原型链和继承(重点!!!)

原型链作为继承的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。 
        每个构造函数都有一个原型对象prototype,原型对象都包含一个指向构造函数的指针constructor,而实例对象都包含一个指向原型对象的内部指针__proto__。如果让一个函数的原型对象等于另一个函数的的实例,那么该函数的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条,这就是原型链。

                                     JS-原型对象、原型链和继承_第4张图片

通过实现原型链,本质上扩展了原型搜索机制,当以读取模式访问一个实例属性时,首先会在实例中搜索该属性。如果没有找到该属性,则会继续搜索实例的原型。在通过原型链实现继承的情况下,搜索过程就得以沿着原型链继续向上。

 

你可能感兴趣的:(JS-原型对象、原型链和继承)