原型对象和原型链
原型对象
每一个构造函数都有一个原型对象
每一个原型对象里都有一个指向构造函数的指针(constructor)
每一个实例对象都有一个指向原型对象的内部指针(proto)
原型对象上的属性和方法能够被实例对象访问
实例对象通过内部指针指向原型对象,原型对象通过指针指向构造函数
构造函数是生成对象的模板,对象是构造函数的实例
prototype 通过构造函数生成对象实例时,会将对象实例的原型指向构造函数的prototype属性
每一个构造函数都有一个prototype属性,这个属性就是对象实例的原型对象
原型的概念
JavaScript的所有对象中都包含了一个[proto]内部属性,这个属性所对应的就是自身的原型
JavaScript的函数对象,除了原型[proto]外,还有prototype属性;当函数对象作为构造函数创建实例时,该prototype属性值将被作为实例对象的原型[proto]
原型链的概念
当一个对象调用自身不存在的属性或者方法时,就会去自己[proto]关联的前辈prototype对象上去找,如果没找到,就会去该prototype原型[proto]关联的前辈prototype去找。以此类推,直到找到该属性或者方法或者undefined为止。从而形成了所谓的"原型链"。
小结
JavaScript中的对象,都有一个内置属性[prototype],指向这个对象的原型对象。当查找一个属性或者方法时,如果在当前对象中找不到,会继续在当前对象的原型对象中查找;如果原型对象中依然没有找到,会继续在原型对象的原型中查找(原型也是对象,也有它自己的原型);直到找到为止,或者查找到最顶层的原型对象中也没有找到,就结束查找,返回undefined。这个查找过程是一个链式的查找,每个对象都有一个到它自身原型对象的链接,这些链接组建的整个链条就是原型链。拥有相同原型的多个对象,他们的共同特征正是通过这种查找模式体现出来的。
在上面的查找过程,提到了最顶层的原型对象,这个对象就是Object.prototype,这个对象中保存了最常用的方法,如toString、valueOf、hasOwnProperty等,因此我们才能在任何对象中使用这些方法。
发表评论 (审核通过后显示评论):