1. 程式人生 > >javascript 繼承&原型鏈

javascript 繼承&原型鏈

原型物件 prototype

每個函式都有一個 prototype 屬性,這個屬性是一個指標,指向函式的原型物件。

原型物件有一個屬性 constructor ,這個屬性包含一個指向 prototype 屬性所在的函式(建構函式)的指標

當呼叫建構函式建立一個例項,這個例項內部將包含一個指標,指向建構函式的原型物件。

在這裡插入圖片描述
當為物件例項新增一個屬性時,這個屬性就會遮蔽原型物件中儲存的同名屬性,但不會修改那個屬性。即使將這個屬性設定為 null,也只會在例項中設定這個屬性,而不會恢復其指向原型的連線。不過,使用 delete 操作符則可以完全刪除例項屬性,從而讓我們能夠重新訪問原型中的屬性

使用 hasOwnProperty()方法可以檢測一個屬性是存在於例項中,還是存在於原型中。

in 操作符:會在通過物件能過訪問到給定屬性時返回 true ,無論這個屬性是在例項中還是原型中。

同時使用 hasOwnProperty()方法和 in 操作符,就可以確定該屬性到底是存在於物件中,還是存在於原型中。

原型鏈

原型鏈是實現繼承的主要方法。其基本思想是利用原型讓一個引用型別繼承另一個引用型別的屬性和方法。

概念:

每個建構函式都有一個原型物件,原型物件都包含一個指向建構函式的指標,例項都包含一個指向原型物件的指標。假如原型物件是另一個建構函式的例項,那麼原型物件也包含一個指向另一個原型的指標,如此層層遞進,就叫原型鏈。

所有引用型別都預設繼承自 object ,object 的原型為null。

確定原型與例項之間的關係:instanceof isPrototypeOf

原型鏈的問題:在建立子型別的例項時,不能向超型別的建構函式中傳遞引數。實際上, 應該說是沒有辦法在不影響所有物件例項的情況下,給超型別的建構函式傳遞引數。

借用建構函式

等待…