回顧一下類,實(shí)例,prototype,__proto__的關(guān)系
function People (name,age) {
this.name = name;
this.age = age;
}
People.prototype = {
sayName: function () {
console.log(this.name);
},
}
var p1 = new People('deejay',21);
p1.sayName();
類,實(shí)例,prototype,__proto__
另外有:
p1.__proto__.constructor === People; // true
People.prototype.constructor === People; //true
p1.constructor === People; //true
對于p1.construcror來說,在p1中找不到相應(yīng)的屬性,就回到__proto__中尋找,其實(shí)找到的是People.prototype中的constructor,和第2行等價(jià)
任何一個對象,只要是一個對象,那么總有一個函數(shù)創(chuàng)建了它,這個對象的__proto__屬性等于創(chuàng)建它的函數(shù)的prototype
比如說People.prototype也是一個對象,也有__proto__屬性,其中的constructor指向了Object(),即是Object()創(chuàng)建的對象,其prototype屬性等于People.prototype.__proto__.
詳細(xì)的原型鏈
原型鏈
在上圖中有幾個需要注意的特殊點(diǎn):
- Object.prototype.__proto__為null,其實(shí)就是不存在
- Function.prototype也是一個對象,即也是Object()創(chuàng)建的
- 對于Function自身來說,也是一個對象,也有__proto__屬性,F(xiàn)unction.__proto__.constructor === Function,即Function創(chuàng)建了所有的函數(shù),包括他自己。
- 對于Object.__proto__.constructor === Function,還是那句話,F(xiàn)unction創(chuàng)建了所有的函數(shù),包括他自己。