查漏補缺
隱式原型(__proto__
):每個例項物件都有乙個私有屬性__proto__
,該屬性指向它的建構函式的原型物件
原型鏈中的注意點:當訪問乙個物件的屬性時會進行以下過程
首先檢視該物件上是否有對應屬性
檢視該物件的 隱式原型(__proto__
)是否有對應屬性
再檢視該物件的 隱式原型 的隱式原型 層層向上,直到搜尋到或者到原型鏈的末尾(object.prototype.__proto__
為null
即為末尾)
舉個例子屬性繼承
// user建構函式
function
user
(name, age)
// 建立乙個user的例項物件user1
var user1 =
newuser
('原型鏈',18
);console.
log(user1.value)
;// 自身擁有該屬性,且值為1,輸出1
console.
log(user1.newvalue)
;// 自身無該屬性且隱式原型上也沒有,再往上搜尋隱式原型的隱式原型,直到搜尋到原型鏈末尾都沒有,所以輸出undefined
// tips:這裡user1.__proto__為user1的隱式原型,在往上查詢隱式原型user1.__proto__.__proto__為object.prototype(object的原型)在往上查詢隱式原型就為null了
user.prototype.newvalue =2;
// 在隱式原型上新增乙個newvalue屬性
console.
log(user1.newvalue)
;// 自身無該屬性,但是隱式原型上有該屬性,所以輸出1
函式同樣也是物件,當繼承的函式被呼叫時,this指向的時當前繼承的物件,而不是繼承的函式所在的原型物件。且繼承的函式可以被重寫
var user1 =};
console.
log(user1.
say())
;// hello i am oldname
var user2 = object.
create
(user1)
;// user2是乙個繼承自user1的物件,為乙個空物件沒有自身屬性
console.
log(user2.
say())
;// 這裡user2自身沒有屬性,所以通過隱式原型查詢到name屬性為oldname。輸出hello i am oldname
user2.name =
"newname"; // 為user2設定自身的name屬性
console.
log(user2.
say())
;// 這裡user2的自身有name屬性,所以this指向自身的name屬性,輸出hello i am newname
前端小白,記錄學習,如有錯誤,萬望指正。 原型與原型鏈
原型有兩種 1為顯示原型,2為隱式原型 1.顯示原型 a prototype b 每個函式都有乙個顯示原型prototype當然函式也有隱式原型 c 原型就是函式的乙個屬性,這個屬性名叫做prototype d 這個屬性即prototype的型別是object 2.隱式原型 a proto b 每個...
原型與原型鏈
圖中一共標了7條線,就一條一條的講,講完了就應該懂了 已知 1.函式是物件,原型也是物件 2.proto 每乙個物件都有,prototype是函式特有的 3.物件的 proto 屬性指向該物件建構函式的 原型 prototype 線1.物件f1的 proto 屬性指向其建構函式的原型 其建構函式 f...
原型與原型鏈
值型別 string,number,boolean,undefined function person var p1 newperson p1即為建構函式person 的例項化物件 var arr 10 20,30 40,50 60 這種語法糖形式的物件建立,是由array 函式建立簡化而來的。這個...