国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

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

本文將假定您至少對構造函數(shù)以及子類和父類的概念有所了解。如果你不了解這些,則可能需要從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。下面是魚和鱒魚的構造函數(shù):

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
}
}

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

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

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

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

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

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

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

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

super()在這里很有用,因為我希望我的trout類實現(xiàn)一個類似的方法,該方法可以完成相同的工作,并且還要多做一些事情—它在更新HTML之前為該元素執(zhí)定了一個類名。我可以通過在相關類函數(shù)內調用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類上定義的。

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

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

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

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

如果你有興趣深入了解這里發(fā)生的事情,Eric Green有一篇優(yōu)秀的帖子,里面有很多代碼片段,介紹了如何使用和不使用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中的類。

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

2019-12-02 16:23:03

Python編程語言“垃圾”回收

2020-12-11 11:11:44

原子類JavaCAS

2022-08-30 07:39:57

C++namespace隔離

2021-01-04 08:09:07

Linux內核Watchdog

2021-12-29 07:18:20

重構工具資源

2022-01-11 15:44:15

JavaScript圖表庫數(shù)據(jù)

2024-10-16 15:11:58

消息隊列系統(tǒng)設計

2022-03-06 20:35:41

并發(fā)串行CAP

2023-07-06 13:56:14

微軟Skype

2024-01-02 13:26:39

TLSC#線程

2021-06-30 07:19:35

微服務業(yè)務MySQL

2019-12-12 14:52:10

數(shù)據(jù)庫腳本

2020-09-08 06:54:29

Java Gradle語言

2021-01-28 22:31:33

分組密碼算法

2023-09-22 17:36:37

2020-05-22 08:16:07

PONGPONXG-PON

2024-03-28 09:02:25

PythonGetattr工具

2018-07-23 15:28:29

HTTPCookieHeader

2018-06-07 13:17:12

契約測試單元測試API測試

2021-08-01 09:55:57

Netty時間輪中間件
點贊
收藏

51CTO技術棧公眾號

欧洲亚洲一区二区| 亚洲三级欧美| 一区av在线播放| 成人欧美一区二区三区视频 | 美女脱光内衣内裤视频久久网站 | 美女视频黄a视频全免费观看| 国产高清不卡二三区| 国产福利久久精品| 欧美精品福利| 亚洲中字在线| 在线日韩av观看| 丁香六月激情网| 91麻豆国产福利在线观看宅福利| 亚洲free嫩bbb| 日韩最新在线| 午夜精品一区二区三区在线播放 | 丁香一区二区三区| 裸体裸乳免费看| 激情综合网激情| 中日韩在线视频| 国产一区二区在线看| 日本黄色播放器| 国产成人午夜高潮毛片| av无码久久久久久不卡网站| 国产精品1区2区3区| 人人妻人人澡人人爽欧美一区双| 久久99精品久久久久| 一区二区三区不卡在线| 国产精品888| jizzjizz国产精品喷水| 国产精品久久久久久久午夜片| 欧美精品99久久| 精品欧美日韩精品| 国产日韩欧美不卡在线| 在线播放亚洲激情| xxxxx.日韩| 欧美精品一区二区三区国产精品| 亚洲精品一区二区三区在线| 国产资源在线一区| 天天综合狠狠精品| 国产·精品毛片| 自拍偷拍一区二区三区四区| 亚洲一本大道在线| 日韩av资源站| 精品免费日韩av| 日韩av首页| 97超碰色婷婷| 亚洲国产日韩在线| 妞干网在线播放| 一区二区三区国产| 亚乱亚乱亚洲乱妇| 伊人精品在线观看| 神马电影久久| 欧美在线一二三区| 成人精品小蝌蚪| 粉嫩喷白浆久久| 亚洲第一在线视频| 风间由美中文字幕在线看视频国产欧美| 国产精品久久色| 麻豆精品视频在线| 成人拍拍拍免费视频网站| 色成年激情久久综合| 在线观看涩涩| 国模精品视频一区二区| 激情综合视频| 黄色免费观看视频网站| 日韩欧美成人精品| av成人免费看| 国产99视频在线观看| 日精品一区二区三区| 国产成人黄色网址| 7799精品视频| 自拍亚洲一区| 在线观看日韩片| 亚洲国产va精品久久久不卡综合 | 成人羞羞视频免费| 成人综合激情网| 国产视频三级在线观看播放| 亚洲免费电影在线观看| 成人网18免费网站| 日韩极品视频在线观看| 在线视频国内自拍亚洲视频| 中文幕av一区二区三区佐山爱| 国产女主播一区二区| 国产亚洲综合性久久久影院| www久久日com| 国产精品自产拍在线观看中文 | 欧美专区福利免费| 91亚洲va在线va天堂va国| 高清av一区二区| 麻豆影院在线| 国产精品第10页| 成人丝袜视频网| 黄网站在线免费看| 国产精品一区二区三区毛片淫片| 精品制服美女丁香| 男女视频在线观看免费| 91高潮精品免费porn| 国产精品99久久久| 国产丝袜在线| 96久久精品| 午夜精品久久久久久久久| 91成人在线精品视频| 每日在线观看av| 国产视频精品xxxx| 欧美在线播放| 欧美午夜黄色| 一本在线高清不卡dvd| 最新真实国产在线视频| 亚洲日本成人网| 色哟哟精品丝袜一区二区| 色香蕉在线观看| 欧美精品乱码久久久久久按摩 | 国产一区二区三区久久久久久久久| 人妻无码视频一区二区三区| 日韩一区二区三区观看| 全球成人免费直播| 欧美视频在线观看 亚洲欧| 欧美黄色a视频| 久中文字幕一区| 岛国视频午夜一区免费在线观看| 日韩欧美成人网| 麻豆一区二区| 色悠悠久久综合网| 久久国产精品久久久久| 99久久综合99久久综合网站| 色网在线免费观看| 中文字幕一区二区三区5566| 欧美大片免费久久精品三p| 香蕉国产精品偷在线观看不卡| 成人在线二区| 国产乱码精品一区二区三区中文 | 波多野结衣与黑人| 亚洲欧美制服中文字幕| 国产成人亚洲精品青草天美| 日韩欧美另类一区二区| 男女啪啪免费视频网站| 欧美成人一区在线| 1024成人网色www| 日韩一区二区三区免费播放| 中文字幕免费在线观看| 99高清视频有精品视频| 欧美丰满美乳xxx高潮www| 老司机午夜精品视频| 午夜影院在线观看国产主播| 日韩欧美精品免费| 欧美成人免费播放| 亚洲精品久久久蜜桃| 亚洲影视一区二区三区| av在线之家电影网站| 色一情一区二区三区四区| 亚洲视频第一页| 99久久婷婷国产综合精品| 麻豆视频久久| eeuss在线观看| 欧美一级二级三级九九九| 亚洲欧美成人精品| 91丨porny丨在线| 日本大胆欧美| 少女频道在线观看高清| 国产人妻777人伦精品hd| 在线视频亚洲| jk漫画禁漫成人入口| 无人在线观看的免费高清视频| 国产精品久久久久999| 欧美久久免费观看| 成人午夜av在线| 色综合综合色| 黄色成人在线网| 手机在线看福利| 91久久精品国产91久久性色tv| 亚洲成人中文字幕| 亚洲国产成人午夜在线一区| 欧美成熟视频| 成人在线高清| 日本一级在线观看| 国产精品自拍合集| 国产美女直播视频一区| 亚洲福利视频免费观看| 亚洲欧美一区二区三区久本道91| 亚洲激情av| 6080亚洲理论片在线观看| 免费av网站在线看| 超碰影院在线观看| 国产一级精品aaaaa看| 精品久久久91| 欧美影院午夜播放| 久久免费电影网| 国产欧美一级| 久久久久97| av免费不卡| 一线天粉嫩在线播放| 国产成人一二三区| av成人午夜| 性欧美视频videos6一9| 精品国产一区二区亚洲人成毛片| 国产精品激情偷乱一区二区∴| 奇米影视一区二区三区| 色无极亚洲影院| 一区三区自拍|