成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一聊 JavaScript 中的 Super() 是什么?

開發 前端
本文將假定您至少對構造函數以及子類和父類的概念有所了解。如果你不了解這些,則可能需要從Mozilla的Object-oriented JavaScript for beginners開始學習。

當你在js代碼中看到有調用super()時,會不會好奇這個super()到底有什么作用?在子類中,您可以使用super()調用其父級的構造函數,并使用super.<方法名>來訪問其父級的方法。

本文將假定您至少對構造函數以及子類和父類的概念有所了解。如果你不了解這些,則可能需要從Mozilla的Object-oriented JavaScript for beginners開始學習。

super并不是只javascript語言才有--許多其它編程語言,如java, python都有一個super()關鍵字來提供對父類的引用。與Java和Python不同,JavaScript并不是圍繞類繼承模型構建的。相反,它擴展了JavaScript的原型繼承模型,以提供與類繼承一致的行為。

讓我們進一步了解它,并查看一些代碼示例。

首先,這里引用的一段話Mozilla’s web docs for classes:

JavaScript classes, introduced in ECMAScript 2015, are primarily syntactical sugar over JavaScript’s existing prototype-based inheritance. The class syntax does not introduce a new object-oriented inheritance model to JavaScript.

一個簡單的子類和父類的例子將有助于說明這句話的真正含義:

class Fish {
constructor(habitat, length) {
this.habitat = habitat
this.length = length
}
renderProperties(element) {
element.innerHTML = JSON.stringify(this)
}
}
class Trout extends Fish {
constructor(habitat, length, variety) {
super(habitat, length)
this.variety = variety
}
renderPropertiesWithSuper(element) {
element.className="green"
super.renderProperties(element);
}
}
let grouper = new Fish("saltwater", "26in");
console.log(grouper);
grouper.renderProperties(document.getElementById("grouper"));
let rainbowTrout = new Trout("freshwater", "14in", "rainbow");
console.log(rainbowTrout);
//invoke function from parent prototype
rainbowTrout.renderProperties(document.getElementById("rainbowTrout"));
//invoke function from child's prototype
rainbowTrout.renderPropertiesWithSuper(document.getElementById("rainbowTroutParent"));

我的例子有兩個類:Fish和 Trout。所有的魚都有棲息地和長度的信息,所以這些屬性屬于魚類。鱒魚也有一個多樣性的屬性,所以它基于fish又擴展了屬性variety。下面是魚和鱒魚的構造函數:

class fish {
constructor(habitat, length) {
this.habitat = habitat
this.length = length
}
}
class trout extends fish {
constructor(habitat, length, variety) {
super(habitat, length)
this.variety = variety
}
}

魚類的構造函數定義棲息地和長度,鱒魚的構造函數定義了種類。我必須在鱒魚的構造函數中調用super(),否則在嘗試設置this.variety時會出現錯誤。那是因為在鱒魚類的第一行中,我告訴JavaScript鱒魚是使用extends關鍵字的“魚”。

這意味著鱒魚的上下文包括fish類中定義的屬性和方法,以及鱒魚為其自身定義的任何屬性和方法。調用super()本質上使JavaScript知道魚是什么,以便可以為鱒魚創建this上下文,其中包括魚中的所有內容以及我們將為鱒魚定義的所有內容。fish類不需要super(),因為它的“父級”只是JavaScript對象。Fish已處于原型繼承鏈的頂部,因此無需調用super()。

我在trout的構造函數中調用super(habitat, length),使這三個屬性在這個上下文中立即可用。實際上還有另一種方法可以從trout的構造函數中得到相同的行為。我必須調用super()來避免引用錯誤,但我不必使用fish的構造函數所期望的參數正確調用它。

這是因為我不需要使用super()來給fish創建的字段賦值,我只需要確保這些字段存在于這個上下文上。這是JavaScript與真正的類繼承模型(例如Java)之間的重要區別,根據我的實現方式,以下代碼可能是非法的:

class trout extends fish {
constructor(habitat, length, variety) {
super()
this.habitat = habitat
this.length = length
this.variety = variety
}
}

這種替代的trout構造函數使您更難分辨哪些屬性屬于fish和哪些屬性屬于trout,但其結果與前面的示例相同。唯一的區別是,在此情況下,不帶參數調用super()會在當前此this的上下文上創建屬性habitat和length,而無需為其分配任何內容。

如果我在第三行之后調用console.log(this),它將顯示{habitat:undefined,length:undefined}。第四行和第五行分配值。

我也可以在trout的構造函數之外使用super(),以引用父類上的方法。在這里,我定義了renderProperties方法,該方法會將類的所有屬性顯示在我傳遞給它的HTML元素中。

super()在這里很有用,因為我希望我的trout類實現一個類似的方法,該方法可以完成相同的工作,并且還要多做一些事情—它在更新HTML之前為該元素執定了一個類名。我可以通過在相關類函數內調用super.renderProperties()來重用fish類中的邏輯。

class fish {
renderProperties(element) {
element.innerHTML = JSON.stringify(this)
}
}
class trout extends fish {
renderPropertiesWithSuper(element) {
element.className="green"
super.renderProperties(element);
}
}

你在定義時方法命名很重要。我把我在trout類中的方法叫做renderPropertiesWithSuper(),因為我仍然希望可以選擇調用trout.renderProperties(),因為它是在fish類上定義的。

如果我只是將函數命名為trout類中的renderProperties,那將是完全有效的;但是,我將不再能夠從trout的實例中直接訪問這兩個函數--調用trout.renderProperties將調用定義在trout上的函數。

這不一定是一個有用的實現方式--可以說,像這樣調用super的函數覆蓋其父函數的名稱是一個更好的模式--但它確實說明了JavaScript允許你的類是多么靈活。

其實也可以完全可以不使用前面代碼示例中非常有用的super()或extends關鍵字來實現這個例子,只是不太方便。這就是Mozilla所說的 "語法糖 "的意思。事實上,如果我把我之前的代碼插入像Babel這樣的移植器中,以確保我的類能與舊版本的JavaScript一起工作,它將生成一些更接近下面的代碼。

這里的代碼大部分是一樣的,但你會注意到,如果沒有extends和super(),我必須將fish和trout定義為函數并直接訪問它們的原型。我還必須在第15、16和17行對原型做一些額外的改動,并確保trout可以在其構造函數中傳遞正確的this上下文(混合繼承)。

如果你有興趣深入了解這里發生的事情,Eric Green有一篇優秀的帖子,里面有很多代碼片段,介紹了如何使用和不使用ES2015構建類以及其繼承的關系。

function Fish(habitat, length) {
this.habitat = habitat;
this.length = length;
}
Fish.prototype.renderProperties = function(element) {
element.innerHTML = JSON.stringify(this)
};
function Trout(habitat, length, variety) {
this._super.call(this, habitat, length);
this.variety = variety;
}
Trout.prototype = Object.create(Fish.prototype);
Trout.prototype.constructor = Trout;
Trout.prototype._super = Fish;
Trout.prototype.renderPropertiesWithSuper = function(element) {
element.className="green";
this.renderProperties(element);
};
let grouper = new Fish("saltwater", "26in");
grouper.renderProperties(document.getElementById("grouper"));
var rainbowTrout = new Trout("freshwater", "14in", "rainbow");
//invoke function from parent
rainbowTrout.renderProperties(document.getElementById("rainbowTrout"));
//invoke function from child
rainbowTrout.renderPropertiesWithSuper(document.getElementById("rainbowTroutParent"));

JavaScript中的類是共享功能的強大方法。例如,React中的類組件依賴于它們。但是,如果您習慣使用另一種使用類繼承模型的語言進行面向對象的編程,那么JavaScript的行為有時可能會令人驚訝。所以學習原型繼承的基礎知識可以幫助闡明如何使用JavaScript中的類。

責任編輯:姜華 來源: 新鈦云服
相關推薦

2020-12-11 11:11:44

原子類JavaCAS

2019-12-02 16:23:03

Python編程語言“垃圾”回收

2022-08-30 07:39:57

C++namespace隔離

2021-01-04 08:09:07

Linux內核Watchdog

2022-01-11 15:44:15

JavaScript圖表庫數據

2021-12-29 07:18:20

重構工具資源

2023-07-06 13:56:14

微軟Skype

2021-06-30 07:19:35

微服務業務MySQL

2022-03-06 20:35:41

并發串行CAP

2024-10-16 15:11:58

消息隊列系統設計

2020-09-08 06:54:29

Java Gradle語言

2024-01-02 13:26:39

TLSC#線程

2019-12-12 14:52:10

數據庫腳本

2020-05-22 08:16:07

PONGPONXG-PON

2021-01-28 22:31:33

分組密碼算法

2023-09-22 17:36:37

2018-06-07 13:17:12

契約測試單元測試API測試

2018-07-23 15:28:29

HTTPCookieHeader

2024-03-28 09:02:25

PythonGetattr工具

2021-08-01 09:55:57

Netty時間輪中間件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊人久久综合 | 国产精品视频偷伦精品视频 | 一区二区三区在线免费观看 | 九九av| caoporn国产精品免费公开 | 狠狠av| 国产91丝袜 | 一级欧美一级日韩片 | 日韩精品成人av | 久国产视频 | 日本一级淫片免费啪啪3 | 亚洲欧美日本在线 | 日本在线一区二区 | 久久激情视频 | 欧美精三区欧美精三区 | 日韩欧美二区 | 亚洲电影第1页 | 亚洲五码在线 | 自拍偷拍第一页 | 在线观看成人小视频 | 日韩超碰 | 嫩草视频在线免费观看 | 91av久久久 | 免费激情 | 伊人精品在线视频 | 欧美伊人久久久久久久久影院 | 精品国产一区二区三区久久久蜜月 | 国产ts人妖另类 | 色视频网站 | 成人性视频在线播放 | 国产精品视频网站 | 久久99精品久久久久久国产越南 | 国产精品久久久久久久久久 | 一级片av| 91精品国产高清一区二区三区 | 欧美综合国产精品久久丁香 | 欧美日本一区 | 欧洲一区二区在线 | 日韩一区在线视频 | 99热精品久久 | 在线观看中文字幕 |