【每日一題NO.56】實現(xiàn)原型鏈繼承(繼承系列-1)

人生苦短,總需要一點儀式感。比如學(xué)前端~
繼承
??
繼承是面向?qū)ο缶幊讨杏懻撟疃嗟脑掝}。很多面向?qū)ο笳Z言都支持兩種繼承:接口繼承和實現(xiàn)繼承。前者只繼承方法簽名,后者繼承實際的方法。接口繼承在 ECMAScript 中是不可能的,因為函數(shù)沒有簽名(函數(shù)簽名[1])。實現(xiàn)繼承是 ECMAScript 唯一支持的繼承方式,而這主要是通過原型鏈實現(xiàn)的。
構(gòu)造函數(shù)、原型和實例化對象的關(guān)系:
每個構(gòu)造函數(shù)都有一個原型對象prototype;
原型對象都包含一個指向構(gòu)造函數(shù)的指針constructor;
而實例化對象都包含一個指向原型對象的內(nèi)部指針__proto__。
一個原型對象繼承的簡單例子:
原理:將子類的原型指向父類的實例化對象
function?Father()?{
??this.property?=?'father';
}
Father.prototype.getFatherValue?=?function?()?{
??return?this.property;
};
function?Son()?{
??this.sonProperty?=?'son';
}
//?繼承?Father?-?將子類Son的原型指向父類Father的實例化對象
Son.prototype?=?new?Father();?//?Son.prototype?被重寫
Son.prototype.getSonVaule?=?function?()?{
??return?this.sonProperty;
};
var?instance?=?new?Son();
console.log(instance.getFatherValue());?//?'father'?沿著原型鏈查找到該方法
子類實例的原型鏈,打印如下圖:
原型鏈并非十分完美,會存在以下問題:
當(dāng)原型鏈中包含引用類型值的原型時,原型中包含的引用值會在所有實例間共享 在創(chuàng)建子類型時,不能向父類型的構(gòu)造函數(shù)中傳遞參數(shù)
更多原型鏈繼承的方式
基于以上問題,所以在實踐中,原型鏈基本不會被單獨使用。從而出現(xiàn)了一些彌補方案:
盜用構(gòu)造函數(shù)繼承(為了解決原型包含引用值導(dǎo)致的繼承問題) 組合繼承 原型繼承 寄生式繼承 寄生式組合繼承
Reference
函數(shù)簽名 Signature (functions) : 一個函數(shù)簽名(或類型簽名,或方法簽名)定義了函數(shù)或方法的輸入與輸出。
所有《每日一題》的 知識大綱索引腦圖 整理在此:https://www.yuque.com/dfe_evernote/interview/everyday
你也可以點擊文末的 “閱讀原文” 快速跳轉(zhuǎn)

評論
圖片
表情

