您好,登錄后才能下訂單哦!
JavaScript中創(chuàng)建類的優(yōu)秀做法以及什么時(shí)候創(chuàng)建類,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
使用默認(rèn)參數(shù)和屬性縮寫,清理我們的JavaScript代碼很容易。
為了讓我們的構(gòu)造函數(shù)更好地發(fā)揮作用,我們應(yīng)該做一些事情。它們是:
如果可能的話,初始化所有構(gòu)造函數(shù)中的所有成員數(shù)據(jù)
我們應(yīng)該將它們?nèi)糠湃霕?gòu)造函數(shù)中,以便在實(shí)例化對象時(shí)將它們?nèi)砍跏蓟?/p>
所以我們可以這樣寫:
class Person { constructor(name) { if (this.instance) { this.instance = { name } } return this.instance; } }
現(xiàn)在我們確保所有的東西都用一個(gè)值初始化了。
在構(gòu)造函數(shù)中創(chuàng)建一個(gè)單例
如果我們只需要一個(gè)構(gòu)造函數(shù)的一個(gè)實(shí)例,那么我們可以創(chuàng)建一個(gè)實(shí)例。
例如,我們可以編寫以下代碼:
class Person { constructor(name) { if (this.instance) { this.instance = { name } } return this.instance; } }
在上面的代碼中,如果 this.instance 還沒有定義,我們返回我們創(chuàng)建的對象。
否則,我們將返回設(shè)置為 this.instance 的任何內(nèi)容。
優(yōu)先使用深度拷貝而不是淺拷貝
深度拷貝會復(fù)制所有內(nèi)容,因此比淺層復(fù)制要好得多,淺拷貝會留下一些引用原始對象的東西。
如果我們想要真正的副本,那就不好了。
因此,我們必須編寫代碼來制作深層副本,如下所示:
const copy = obj => { const copied = { ...obj }; for (const k of Object.keys(obj)) { if (typeof obj[k] === 'object') { copied[k] = { ...copied[k] }; copy(copied[k]); } } return copied; }
如果發(fā)現(xiàn)嵌套對象,我們只使用擴(kuò)展運(yùn)算符來復(fù)制嵌套對象,并遞歸執(zhí)行相同的操作。
然后,我們返回我們復(fù)制的對象。
我們不應(yīng)該總是創(chuàng)建類。在一些場景中,創(chuàng)建一個(gè)類是有意義的。
模擬現(xiàn)實(shí)世界的對象
類非常適合建模真實(shí)世界的對象,因?yàn)樗鼈兛梢越ο蟮男袨椤?/p>
它們允許我們將實(shí)例變量和方法封裝到一個(gè)包中,分別存儲狀態(tài)和對對象執(zhí)行操作。
建模抽象對象
同樣,我們可以使用類對抽象對象進(jìn)行建模。
它們可以用來進(jìn)行抽象,抽象是對不同類型對象的概括。
類非常適合存放子類的共享成員,子類可以繼承它們。
但是,我們應(yīng)該保持繼承樹的簡單性,這樣人們就不會被代碼弄糊涂了。
降低復(fù)雜度
我們可以使用類來降低程序的復(fù)雜性。
類非常適合隱藏信息。在JavaScript中,類中還沒有私有變量,因此我們必須在方法中隱藏?cái)?shù)據(jù)。
這樣我們就可以最小化程序不同部分之間的耦合。
隱藏實(shí)現(xiàn)細(xì)節(jié)
方法也適合隱藏實(shí)現(xiàn)細(xì)節(jié)。
我們可以把細(xì)節(jié)隱藏在方法中,只運(yùn)行需要的東西。
為此,我們可以在方法內(nèi)部嵌套函數(shù)和變量。
限制變化的副作用
由于我們可以隱藏事物,因此可以減少更改的影響。
與隱藏實(shí)現(xiàn)一樣,可以通過在方法內(nèi)限制更改的影響來隔離更改的影響。
隱藏全局?jǐn)?shù)據(jù)
通過將全局?jǐn)?shù)據(jù)放入類的方法中,它們可以成為私有數(shù)據(jù)。
這樣,他們就不必向公眾公開。我們要做的就是使用 let 和 const 在方法中聲明它們。
簡化參數(shù)傳遞
如果我們將相同的參數(shù)傳遞給不同的函數(shù),則可以將參數(shù)更改為實(shí)例變量,將函數(shù)更改為方法。
例如,如果我們有:
const speak = (name) => `${name} spoke`; const greet = (name) => `hi, ${name}`;
然后,我們可以將方法放入自己的類中,如下所示:
class Person { constructor(name) { this.name = name; } speak() { return `${this.name} spoke`; } greet() { return `hi, ${this.name}`; } }
現(xiàn)在,我們不必在任何地方傳遞 name。
我們只需要?jiǎng)?chuàng)建一個(gè) Person 實(shí)例,并調(diào)用這些方法而無需傳入任何參數(shù)。
我們可以創(chuàng)建類來封裝數(shù)據(jù)并將內(nèi)容打包在一起。但是,我們不應(yīng)該為所有內(nèi)容創(chuàng)建類。
另外,我們應(yīng)該盡可能深拷貝而不是淺拷貝。
看完上述內(nèi)容,你們掌握J(rèn)avaScript中創(chuàng)建類的優(yōu)秀做法以及什么時(shí)候創(chuàng)建類的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。