知道了顯式原型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乙個物件的過程 建立乙...