原文:https://github.com/mqyqingfeng/Blog/issues/2
每一個JavaScript對象(null除外)在創(chuàng)建的時候就會與之關聯(lián)另一個對象锨天,這個對象就是我們所說的原型排吴,每一個對象都會從原型"繼承"屬性捧毛。
image.png
每一個JavaScript對象(除了 null )都具有的一個屬性政冻,叫proto稠歉,這個屬性會指向該對象的原型附较。
image.png
constructor钞馁,每個原型都有一個 constructor 屬性指向關聯(lián)的構(gòu)造函數(shù)坪稽。
image.png
當讀取實例的屬性時,如果找不到扛伍,就會查找與對象關聯(lián)的原型中的屬性筷畦,如果還查不到,就去找原型的原型刺洒,一直找到最頂層為止鳖宾。
Object.prototype.proto 的值為 null 跟 Object.prototype 沒有原型,其實表達了一個意思逆航。所以查找屬性的時候查到 Object.prototype 就可以停止查找了。
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
繼承意味著復制操作蚤假,然而 JavaScript 默認并不會復制對象的屬性,相反吧兔,JavaScript 只是在兩個對象之間創(chuàng)建一個關聯(lián)磷仰,這樣,一個對象就可以通過委托訪問另一個對象的屬性和函數(shù)境蔼,所以與其叫繼承灶平,委托的說法反而更準確些伺通。