国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

15分鐘深入了解JS繼承分類、原理與用法

2024-05-06 15:43:03
字體:
來源:轉載
供稿:網友

本文全面講述了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 。

缺點:

    最主要的問題來自包含引用類型值的原型。在通過原型來實現繼承時,原型實際上會變成另一個類型的實例。于是,原先的實例屬性也就順理成章地變成了現在的原型屬性了。 在創建子類型的實例時,不能向超類型的構造函數傳遞參數。

* 題外話:確定原型與實例的關系的兩種方式

    第一種方式是使用 instanceOf 操作符,只要用這個操作符來測試實例的原型鏈中是否出現過某構造函數。如果有,則就會返回 true ;如果無,則就會返回 false 。以下為示例代碼:
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 东安县| 池州市| 秦安县| 汉阴县| 永泰县| 海林市| 海南省| 田阳县| 自治县| 龙陵县| 泽库县| 博湖县| 怀柔区| 泰来县| 福鼎市| 建瓯市| 上犹县| 丁青县| 郴州市| 霍林郭勒市| 彩票| 安阳县| 滦平县| 云霄县| 香格里拉县| 梓潼县| 绍兴县| 精河县| 民勤县| 综艺| 元谋县| 栾城县| 浠水县| 沙河市| 靖江市| 安图县| 甘德县| 陇川县| 黄浦区| 恩平市| 衡水市|