原型
1、在js的世界里萬物皆對象,包括普通對象(var person1=new Person)、構造函數(shù)對象(Person)、原型對象(var PP =Person.Prototype)、Function(構造函數(shù)的構造函數(shù)、所有的構造函數(shù)都是其實例、構造函數(shù)的祖宗)、Object(對象的構造函數(shù),對象的祖宗、所有的對象都是其實例)。
2、每一個對象都有一個指向該對象的構造函數(shù)的原型對象的指針[[prototype]],它在瀏覽器上的實現(xiàn)為對象的一個屬性"__proto__"(意思就是person1.__proto__==PP,Person.__proto__==Function.prototype)。
3、構造函數(shù)有且僅有構造函數(shù)才有prototype屬性,指向該構造函數(shù)的原型對象。(意思就是:Person.prototype==PP)。原型對象都有一個constructor屬性,該屬性指向該對象對應的構造函數(shù)(意思就是:PP.constructor==Person)
4、原型對象的__proto__指向Object對象的原型對象,因為所有的對象都是Object的實例(意思就是PP.__proto__==Object.prototype)
5、構造函數(shù)的__proto__指向Function的原型對象,因為所有的構造函數(shù)都是Function的實例(Person.__proto__==Function.prototype)
6、特殊情況,定義Object的原型對象的__proto__指向null,(意思就是:Object.prototype.__proto__==null)
原型鏈
查找特定屬性的時候,我們先去這個對象里去找,如果沒有的話就去它的原型對象里面去找,如果還是沒有的話再去向原型對象的原型對象里去尋找...... 直到找到Object的原型上為止,這個操作被委托在整個原型鏈上,這個就是我們說的原型鏈了。
根據(jù)以上信息可繪制一張圖,類似這樣:圖片來源
