實現繼承是 ecmascript 唯一支援的繼承方式,而這主要是通過原型鏈實現的建構函式、原型和例項的關係:每個建構函式都有乙個原型物件,原型有乙個屬性(constructor)指回建構函式,而例項有乙個內部指標([[ prototype ]])指向原型。
/* 建構函式 */
function
father()
console.
dir(father)
;/*建構函式內有prototype: constructor指向father */
let fatherinstance =
newfather()
;console.
log(fatherinstance.__proto__)
;/* fatherinstance為father的例項:例項中有乙個指標指向father原型,輸出 */
實現繼承
function
father()
father.prototype.f =
"pf"
function
son(
)/* 現在想要son繼承father,已知son的建構函式的prototype: ,那麼只要改變son的建構函式的原型即可*/
/* son.prototype = father.prototype; 不能使用此方法改變son的原型,因為如此改變後,son的例項只能使用自己的屬性和father原型上的屬性,並沒有繼承father例項中的屬性,而且以後想要修改son的原型必定會破壞father的原型*/
son.prototype =
newfather()
;console.
log(s instanceof
father);
//true
console.
log(s instanceof
son)
;//true
/* 上面用到了instanceof來檢測原型與例項的關係 */
console.
log(s instanceof
object);
//true,找到s原型鏈上有和object一樣的建構函式
console.
log(s instanceof
father);
//true
console.
log(s instanceof
son)
;//true
father.prototype.
isprototypeof
(s);
//true ,s的原型鏈中包含father原型
son.prototype.
isprototypeof
(s);
//true ,s的原型鏈中包含father原型
object.prototype.
isprototypeof
(s);
//true ,s的原型鏈中包含father原型
function
father()
function
son(
)/* 繼承 */
son.prototype =
newfather()
;let s =
newson()
;s.fatherfood.
push
('雞腿');
let s2 =
newson()
;s2.fatherfood;
//["麵條", "雞蛋", "雞腿"],但是s2的fatherfood也改變
function
father
(name)
function
son(
)let s =
newson()
;s.fatherfood.
push
('雞腿');
let s2 =
newson()
;s2.fatherfood;
//["麵條", "雞蛋"],解決了共享記憶體問題
s instanceof
father
;//false
s instanceof
son;
//true
組合繼承(有時候也叫偽經典繼承)綜合了原型鏈和盜用建構函式,將兩者的優點集中了起來。基本的思路是使用原型鏈繼承原型上的屬性和方法,而通過盜用建構函式繼承例項屬性。
function
father
(name)
function
son(
)son.prototype =
newfather()
;/* 繼承父方法 */
let s =
newson()
;s.fatherfood.
push
('雞腿');
let s2 =
newson()
;s2.fatherfood;
//["麵條", "雞蛋"],解決了共享記憶體問題
/* 寄生式顧名思義,在乙個函式內部做了某些操作 */
function
inheritprototype
(father,son)
function
father
(name)
father.prototype.ff=
function()
function
son(
)inheritprototype
(father,son)
;
JS物件導向 繼承
參考博文 一 物件導向的繼承 1 解析 在原有物件的基礎上,略作修改,得到乙個新的物件,並且不影響原有物件的功能 2 如何新增繼承 拷貝繼承 屬性 call 方法 for in 繼承 子類不影響父類,子類可以繼承父類的一些功能 復用 屬性的繼承 呼叫父類的構造1函式 call 方法的繼承 for i...
js 物件導向 繼承
繼承 將方法的定義放在建構函式中,每建立乙個新物件,都會重複建立該方法一模一樣的副本,浪費記憶體。解決 如果多個子物件都要使用乙個相同的方法時,應該把這個方法放在一種原型物件中,建構函式中不再包含方法定義。原型物件 乙個型別中,專門為所有子物件集中儲存共有方法的物件。同一型別下多個子物件需要用乙個共...
js物件導向 繼承
原型模式與建構函式組合 function person name,age,job person.prototype sayjob function 定義singer類,並指定job為singer function singer name,age,song 每次呼叫singer建構函式都會把singe...