本篇內(nèi)容主要講解“JavaScript中super的功能介紹”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“JavaScript中super的功能介紹”吧!
創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為湞江等服務(wù)建站,湞江等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為湞江企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
首先在我的職業(yè)生涯中寫過的super(props)
自己都記不清:
class Checkbox extends React.Component { constructor(props) { super(props); this.state = { isOn: true }; } // ... }
當(dāng)然,在類字段提案 (class fields proposal) 中建議讓我們跳過這個開頭:
class Checkbox extends React.Component { state = { isOn: true }; // ... }
在2015年 React 0.13 增加對普通類的支持時,曾經(jīng)打算用這樣的語法。定義constructor
和調(diào)用super(props)
始終是一個臨時的解決方案,可能要等到類字段能夠提供在工程學(xué)上不那么反人類的替代方案。
不過還是讓我們回到前面這個例子,這次只用ES2015的特性:
class Checkbox extends React.Component { constructor(props) { super(props); this.state = { isOn: true }; } // ... }
為什么我們要調(diào)用super
? 可以調(diào)用它嗎? 如果必須要調(diào)用,不傳遞prop
參數(shù)會發(fā)生什么? 還有其他參數(shù)嗎? 接下來我們試一試:
在 JavaScript 中,super
指的是父類的構(gòu)造函數(shù)。(在我們的示例中,它指向React.Component
的實現(xiàn)。)
重要的是,在調(diào)用父類構(gòu)造函數(shù)之前,你不能在構(gòu)造函數(shù)中使用this
。 JavaScript 是不會讓你這樣做的:
class Checkbox extends React.Component { constructor(props) { // 這里還不能用 `this` super(props); // 現(xiàn)在可以用了 this.state = { isOn: true }; } // ... }
為什么 JavaScript 在使用this
之前要先強制執(zhí)行父構(gòu)造函數(shù),有一個很好的理由能夠解釋。 先看下面這個類的結(jié)構(gòu):
class Person { constructor(name) { this.name = name; } } class PolitePerson extends Person { constructor(name) { this.greetColleagues(); //這行代碼是無效的,后面告訴你為什么 super(name); } greetColleagues() { alert('Good morning folks!'); } }
如果允許在調(diào)用super
之前使用this
的話。一段時間后,我們可能會修改greetColleagues
,并在提示消息中添加Person
的name
:
greetColleagues() { alert('Good morning folks!'); alert('My name is ' + this.name + ', nice to meet you!'); }
但是我們忘記了super()
在設(shè)置this.name
之前先調(diào)用了this.greetColleagues()
。 所以此時this.name
還沒有定義! 如你所見,像這樣的代碼很難想到問題出在哪里。
為了避免這類陷阱,JavaScript 強制要求:如果想在構(gòu)造函數(shù)中使用this
,你必須首先調(diào)用super
。 先讓父類做完自己的事! 這種限制同樣也適用于被定義為類的 React 組件:
constructor(props) { super(props); // 在這里可以用 `this` this.state = { isOn: true }; }
這里又給我們留下了另一個問題:為什么要傳props
參數(shù)?
你可能認(rèn)為將props
傳給super
是必要的,這可以使React.Component
的構(gòu)造函數(shù)可以初始化this.props
:
// Inside React class Component { constructor(props) { this.props = props; // ... } }
這與正確答案很接近了 —— 實際上它就是這么做的。
但是不知道為什么,即便是你調(diào)用super
時沒有傳遞props
參數(shù),仍然可以在render
和其他方法中訪問this.props
。 (不信你可以親自去試試!)
這是究竟是為什么呢? 事實證明,在調(diào)用構(gòu)造函數(shù)后,React也會在實例上分配props
:
// Inside React const instance = new YourComponent(props); instance.props = props;
因此,即使你忘記將props
傳給super()
,React 仍然會在之后設(shè)置它們。 這是有原因的。
當(dāng) React 添加對類的支持時,它不僅僅增加了對 ES6 類的支持。它的目標(biāo)是盡可能廣泛的支持類抽象。 目前還不清楚 ClojureScript、CoffeeScript、ES6、Fable、Scala.js、TypeScript或其他解決方案是如何相對成功地定義組件的。 所以 React 故意不關(guān)心是否需要調(diào)用super()
—— 即使是ES6類。
那么這是不是就意味著你可以寫super()
而不是super(props)
呢?
可能不行,因為它仍然是令人困惑的。 當(dāng)然,React 稍后會在你的構(gòu)造函數(shù)運行后分配this.props
, 但是在調(diào)用super()
之后和構(gòu)造函數(shù)結(jié)束前這段區(qū)間內(nèi)this.props
仍然是未定義的:
// Inside React class Component { constructor(props) { this.props = props; // ... } } // Inside your code class Button extends React.Component { constructor(props) { super(); //我們忘記了傳遞 props 參數(shù) console.log(props); // {} console.log(this.props); // undefined } // ... }
如果這種情況發(fā)生在從構(gòu)造函數(shù)調(diào)用的某個方法中,可能會給調(diào)試工作帶來很大的麻煩。 這就是為什么我建議總是調(diào)用super(props)
,即使在沒有必要的情況之下:
class Button extends React.Component { constructor(props) { super(props); // 傳遞了 props 參數(shù) console.log(props); // {} console.log(this.props); // {} } // ... }
這樣就確保了能夠在構(gòu)造函數(shù)退出之前設(shè)置好this.props
。
最后一點是長期以來 React 用戶總是感到好奇的。
你可能已經(jīng)注意到,當(dāng)你在類中使用Context API時(無論是舊版的contextTypes
或在 React 16.6中新添加的 contextType
API),context
會作為第二個參數(shù)傳遞給構(gòu)造函數(shù)。
那么為什么我們不寫成super(props, context)
呢? 我們可以這樣做,但是使用context
的頻率較低,所以這個坑并沒有那么多影響。
根據(jù)類字段提案的說明,這些坑大部分都會消失。 如果沒有顯式構(gòu)造函數(shù),則會自動傳遞所有參數(shù)。 這允許在像state = {}
這樣的表達(dá)式中包含對this.props
或this.context
的引用(如果有必要的話)。
而有了 Hooks 之后,我們甚至不再有super
或this
。不過這是另外一個的話題了。
到此,相信大家對“JavaScript中super的功能介紹”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
分享文章:JavaScript中super的功能介紹
標(biāo)題來源:http://aaarwkj.com/article4/iggdoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、云服務(wù)器、ChatGPT、App設(shè)計、微信小程序、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)