原型与原型链
原型
1、在js的世界里万物皆对象,包括普通对象(var person1=new Person)、构造函数对象(Person)、原型对象(var PP =Person.Prototype)、Function(构造函数的构造函数、所有的构造函数都是其实例、构造函数的祖宗)、Object(对象的构造函数,对象的祖宗、所有的对象都是其实例)。
2、每一个对象都有一个指向该对象的构造函数的原型对象的指针[[prototype]],它在浏览器上的实现为对象的一个属性"__proto__"(意思就是person1.__proto__==PP,Person.__proto__==Function.prototype)。
3、构造函数有且仅有构造函数才有prototype属性,指向该构造函数的原型对象。(意思就是:Person.prototype==PP)。原型对象都有一个constructor属性,该属性指向该对象对应的构造函数(意思就是:PP.constructor==Person)
4、原型对象的__proto__指向Object对象的原型对象,因为所有的对象都是Object的实例(意思就是PP.__proto__==Object.prototype)
5、构造函数的__proto__指向Function的原型对象,因为所有的构造函数都是Function的实例(Person.__proto__==Function.prototype)
6、特殊情况,定义Object的原型对象的__proto__指向null,(意思就是:Object.prototype.__proto__==null)
原型链
查找特定属性的时候,我们先去这个对象里去找,如果没有的话就去它的原型对象里面去找,如果还是没有的话再去向原型对象的原型对象里去寻找...... 直到找到Object的原型上为止,这个操作被委托在整个原型链上,这个就是我们说的原型链了。
根据以上信息可绘制一张图,类似这样:图片来源