重新認識原型和原型鏈三

2021-09-12 13:42:31 字數 1399 閱讀 6106

知道了顯式原型prototype和隱式原型__proto__,我們就能很好的知道原型鏈是什麼東西了。

說原型鏈之前再理幾個概念:

例項隱式原型__proto__指向建立例項的建構函式的顯示原型prototype。

例項可以通過__proto__呼叫在__proto__下的所有屬性和方法。

所以,原型鏈就這樣出來了:

function user() user.prototype.usereat = 'usereat';

function person() {}

person.prototype = new user();

person.prototype.personeat = 'personeat';

function people(){}

people.prototype = new person();

people.prototype.peopleeat = 'peopleeat';

var people = new people();

console.log(people.usereat);

console.log(people.personeat);

console.log(people.peopleeat);

console.log(people.__proto__);

這邊用到了構造繼承,但是隱式原型確實是可以層層訪問。

再看看這個:

function user() {}

console.log(user.__proto__ === function.prototype);

console.log(function.prototype.__proto__ === object.prototype);

console.log(user.__proto__.__proto__ === object.prototype);

輸出的都是true,因為user是函式物件,所以user的隱式原型__proto__指向function的顯示原型prototype,而函式也繼承於物件,所以function的隱式原型__proto__指向object的顯示原型prototype。

所以原型鏈就是這麼簡單,例項物件通過隱式原型__proto__可以獲取建構函式的所有屬性和方法,又因為這些建構函式的繼承性,例項物件會一層一層向上查詢,這些層級鏈結起來就是原型鏈。最終原型鏈的盡頭是null。

console.log(people.__proto__.__proto__.__proto__.__proto__.__proto__);

console.log(object.prototype.__proto__);

得到的結果是null。

原型 和 原型鏈

每乙個js物件 null除外 都和另乙個物件相關聯。另乙個 物件就是我們熟知的原型,每乙個物件都從原型繼承屬性。所有通過物件直接量建立的物件都具有同乙個原型物件,並可以通過js object.prototype 獲得對原型物件的引用。通過關鍵字new和構造函式呼叫建立的物件的原型就是建構函式的 pr...

原型和原型鏈

原型鏈 例項物件與原型之間的連線,叫做原型鏈 function human human.prototype.age 22 var a new human console.log a.age 這裡的age掛載到了human的原型上面了。其實原型就是乙個物件。a為什麼能找到原型上面的物件呢?這裡例項物件...

原型和原型鏈

建構函式 function foo name age function 其實是 var a new object 的語法糖 var a 其實是 var a new array 的語法糖 function foo 其實是 var foo new function 的語法糖 new乙個物件的過程 建立乙...