本文全面講述了JS繼承分類、原理與用法。分享給大家供大家參考,具體如下:
許多 OO 語言都支持兩種繼承方式:接口繼承和實現繼承。接口繼承只繼承方法簽名,而實現繼承則繼承實際的方法。由于 ECMAScript 中的函數沒有簽名,所以在 JS 中無法實現接口繼承。ECMAScript 只支持實現繼承,而且其實現繼承主要是依靠原型鏈來實現的。所以,下面所要說的原型鏈繼承、借用構造函數繼承、組合繼承、原型式繼承、寄生式繼承和寄生組合式繼承都屬于實現繼承。
最后的最后,我會解釋 ES6 中的 extend 語法利用的是寄生組合式繼承。
1. 原型鏈繼承
ECMAScript 中描述了原型鏈的概念,并將原型鏈作為實現繼承的主要方法。其基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。實現原型鏈繼承有一種基本模式,其代碼大致如下:
function SuperType(){ this.property = true;}SuperType.prototype.getSuperValue = function(){ return this.property;};function SubType(){ this.subproperty = false;}SubType.prototype = new SuperType(); // 敲黑板!這是重點:繼承了 SuperTypeSubType.prototype.getSubValue = function (){ return this.subproperty;};var instance = new SubType();alert(instance.getSuperValue()); // true原型鏈繼承的一個本質是重寫原型對象,代之以一個新類型的實例;給原型添加方法的代碼一定要放在替換原型的語句之后;在通過原型鏈實現繼承時,不能使用對象字面量創建原型方法。
實例屬性在實例化后,會掛載在實例對象下面,因此稱之為實例屬性。上面的代碼中 SubType.prototype = new SuperType(); ,執行完這條語句后,原 SuperType 的實例屬性 property 就掛載在了 SubType.prototype 對象下面。這其實是個隱患,具體原因后面會講到。
每次去查找屬性或方法的時候,在找不到屬性或方法的情況下,搜索過程總是要一環一環的前行到原型鏈末端才會停下來。
所有引用類型默認都繼承了 Object,而這個繼承也是通過原型鏈實現的。由此可知,所有函數的默認原型都是 object 的實例,因此函數的默認原型都會包含一個內部指針,指向 Object.prototype 。
缺點:
* 題外話:確定原型與實例的關系的兩種方式
新聞熱點
疑難解答
圖片精選