這樣學原型鏈,就是簡單了
面試官:請你講講原型鏈
在前面我們已經陸陸續(xù)續(xù)講了構造函數,實例,原型,那么今天我們就來講講原型鏈。
之前我們講過,原型其實也會一個對象,既然是對象,我們也可以用最原始的方式來創(chuàng)建他:

var?obj?=?new?Object()
obj.name?=?"人生代碼"
console.log(obj.name)?//?人生代碼
其實原型對象就是通過 Object 創(chuàng)建的,之前講過實例的 proto 指向構造函數的 prototype,可以理解成,Object.prototype 是所有對象的根對象,所以我們可以更新以下:
原型鏈
每一個對象都有原型,通過 proto 指向上一個原型,最終指向 null,這條鏈存在著終點,就是 Object.prototype 的原型是 null。

補充,易錯點
1.constructor
首先是 constructor 屬性,我們看個例子:
function?Person()?{}
var?person?=?new?Person();
console.log(person.constructor?===?Person);?//?true
當獲取 person.constructor 時,其實 person 中并沒有 constructor 屬性,當不能讀取到 constructor 屬性時,會從 person 的原型也就是 Person.prototype 中讀取,正好原型中有該屬性,所以:
person.constructor?===?Person.prototype.constructor
2.proto
其次是 proto ,絕大部分瀏覽器都支持這個非標準的方法訪問原型,然而它并不存在于 Person.prototype 中,實際上,它是來自于 Object.prototype ,與其說是一個屬性,不如說是一個 getter/setter,當使用 obj.proto 時,可以理解成返回了 Object.getPrototypeOf(obj)。
3.真的是繼承嗎?
最后是關于繼承,前面我們講到“每一個對象都會從原型‘繼承’屬性”,實際上,繼承是一個十分具有迷惑性的說法,引用《你不知道的JavaScript》中的話,就是:
繼承意味著復制操作,然而 JavaScript 默認并不會復制對象的屬性,相反,JavaScript 只是在兩個對象之間創(chuàng)建一個關聯,這樣,一個對象就可以通過委托訪問另一個對象的屬性和函數,所以與其叫繼承,委托的說法反而更準確些。
總結
使用new生成實例的函數就是構造函數,直接調用的就是普通函數; 每個對象都擁有一個原型對象; 每個引用類型的隱式原型都指向它的構造函數的顯式原型; Object.prototype 是所有對象的根對象; 原型鏈存在終點,不會無限查找下去;
