💥本篇文章我將從概念和對應題目知識點講起,希望大家能有所識訓💥
一、原型
①所有參考型別都有一個_proto_(隱式原型)屬性(類似鏈表中的next指標), 鏈表可以通過.next訪問下個元素,原型中可通過._proto_訪問上一級元素,

②所有類都有一個prototype(原型)屬性,例如:Object,Function,Array
③所有參考型別的_proto_屬性指向它建構式的prototype
例如:arr是一個陣列實體,那么arr._proto_=Array.prototype
二、原型鏈
當訪問一個物件的某個屬性時,會先在這個物件本身上查找,如果沒有找到,則會去它的_proto_上查找,即它的建構式的prototype,如果還沒有找到就會繼續在建構式prototype的_proto_中查找,這樣一層一層向上查找就會形成一個鏈式結構,我們稱為原型鏈,
下面例子有助于你對原型鏈的理解:
arr為Array陣列的實體
arr._proto_=Array.prototype
Array._proto_=Object.prototype
分析:arr這個陣列實體,沿著原型鏈找,找到陣列的原型物件,陣列這個類沿著原型鏈找,找到物件的原型物件(最高級),因此也可以用arr._proto_._proto_來找到Object.prototype,類似鏈表中的next指標,只不過_proto_是往上找,
面試真題:
題目一:
instanceof的原理,并用代碼實作
分析:如果A沿著原型鏈能找到B.prototype,那么A instanceof B 為true(用_proto_來找)
解法:遍歷A的原型鏈,如果找到B.prototype,回傳true,否則回傳false
const instanceof =(A,B)=>{
let p = A;
while(p){
if(p === B.prototype){
return true;
}
p = p._proto_;
}
return false;
}
題目二:
var foo = {}, F = function(){};
Object.prototype.a = ‘value a’;
Function.prototype.b = ‘value b’;
console.log(foo.a);
console.log(foo.b);
console.log(F.a);
console.log(F.b);
分析:如果在A物件上沒找到x屬性,那么會沿著原型鏈找x屬性,(如果A為函式實體,那么A上面找不到,就去找Function這個類上有沒有掛載x屬性,如果沒有就繼續往上找到Object原型物件上有沒有x屬性)
解法:明確foo和F變數的原型鏈,沿著原型鏈找a屬性和b屬性
因此答案為:
'value a'
'undefined'
'value a'
'value b'
foo這個物件實體上沒有b屬性,是因為原型鏈不能往下找,只能一層一層往上找,即物件實體不能腆著臉問他的下級Function有沒有掛載b這個屬性
覺得本篇文章對你有幫助的請不要忘記一鍵三連加關注~~
你的支持就是對我最大的動力!!
會繼續努力碼更多的精品文章!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/292065.html
標籤:其他
下一篇:cgb2106-day08
