原型 (prototype)
每个函数都有一个属性——prototype。prototype是一个指向一个对象的指针,叫做显示原型,这个对象叫做原型对象。原型对象当中有一个默认的属性constructor,constructor也是一个指针,他指向构造函数本身。
原型链
每一个构造函数的实例有一个__proto__属性,也叫隐式原型,它指向构造函数的原型。同时 当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
如果一直查找到最后都没有找到这个属性,则是undefined。
下图是对象的隐式原型,object.proto
可以看出:
- 根据原型链查找,如果一层一层往上查找,所有的对象的原型最终都可以寻找得到Object.prototype, Object构造函数的prototype
- 所有的对象都继承了Object.prototype上的属性和方法
- 读取属性和方法的规则:js引擎会先寻找对象本身的属性和方法,如果找不到,就到它的原型对象去找,如果还是找不到,就到原型的原型去找,如果直到最顶层的Object.prototype还是找不到,如果对象和它的原型,都定制了同名的属性,那么优先读取对象自身属性,这也叫覆盖。
原型与原型链的关系: