對于主要目標是創建另一個函式的閉包,我想知道在現代javascript中是否最好只使用現代javascript中的類。
// Closure way private counter
const countPlusOne = () => {
let count = 0;
return () =>{
count ;
console.log(count);
}
}
let demoAdd = countPlusOne();
demoAdd(); // 1
demoAdd(); // 2
demoAdd(); // 3
老實說,我從不喜歡以那種方式使用閉包(但我認為它們非常適合中間件之類的東西),因為它們很難閱讀。
那么,我應該將像 up 這樣的閉包重構為類嗎?它們的行為似乎更類似于來自其他語言的典型物件。
// Class way private counter
class countPlusClass{
count = 0;
add(){
this.count ;
console.log(this.count)
}
}
const demo = new countPlusClass();
demo.add(); // 1
demo.add(); // 2
demo.add(); // 3
uj5u.com熱心網友回復:
閉包比你想象的類有一個顯著的優勢:對于一個類,如果你像你一樣使用公共類欄位,任何可以訪問實體的代碼都可以修改它的值。這通常是不可取的 - 通常應該盡可能地限制范圍,并且您不希望您的類的正確性依賴于類的消費者不修改它(無論是偶然還是故意)。
class countPlusClass{
count = 0;
add(){
this.count ;
console.log(this.count)
}
}
const demo = new countPlusClass();
demo.add(); // 1
demo.add(); // 2
// some code elsewhere in the codebase that has access to the demo instance:
demo.count = 55555;
demo.add(); // not 3...
相比之下,閉包是完全私有的(除非出現奇怪的特殊情況)。
如果你要使用一個類,并且你想模擬閉包的隱私,請確保使用私有類欄位,這樣它們就不能在類之外被修改。
class countPlusClass{
#count = 0;
add(){
this.#count ;
console.log(this.#count)
}
}
const demo = new countPlusClass();
demo.add(); // 1
demo.add(); // 2
// some code elsewhere in the codebase that has access to the demo instance
// cannot modify the private field
demo.count = 55555;
demo.add(); // not 3...
至于哪個更好,基于閉包的物件還是類?這取決于每個開發人員。
uj5u.com熱心網友回復:
不,課程并不總是更好。他們只是不同。我想說的主要區別是
- 建構式/工廠函式回傳的事物的介面。一個類實體有屬性和方法,通常是多個,而閉包只是一個你可以呼叫的函式——只有一個功能。呼叫它們的語法不同,額外的方法名稱有時是多余的,有時是有益的。
- 在 OOP 中,物件應該有一個身份和一個狀態。在 FP 中,函式應該是純函式。當然,您不需要遵循特定的范式,無狀態物件和不純函式一樣都很好(盡管那時可能稱它們為“程序”),但在討論可讀性和可維護性時請記住這些約定。
所以明智地選擇。您(可能在將來)是否需要多種方法?你封裝狀態嗎?然后使用 aclass創建物件。你只需要一個函式來呼叫嗎?然后創建一個閉包。
uj5u.com熱心網友回復:
課程并不總是更好。這真的取決于具體情況。每個都在您的編程工具集中占有一席之地。
一個類具有以下優點:
- 語言中有定義的語法
- 您可以子類化一個類來擴展它
- 您可以更輕松地擁有許多屬性和許多方法。
- 方法自動不可列舉并以嚴格模式運行。
- 使用類的代碼中的語法在某種程度上可以自我描述正在發生的事情,因為
new countPlusClass()它清楚地表明您正在創建一個物件,該物件隨后將具有方法和可能的狀態。這對于您顯示的關閉并不那么明顯。 - 對于具有很多方法的物件,a
class使用的原型有一些節省空間的好處。 - 開發人員工具將識別一個類的實體并知道如何顯示它,在為它輸入代碼時自動完成,如何在除錯器中表示它,如何在錯誤訊息中使用它等等......
閉包具有以下優點:
- 閉包中的資料是完全私有的。沒有人可以從封閉之外得到它。
- 在某些情況下,呼叫者可能會發現使用閉包所需的代碼更少,因為您進行了一個函式呼叫(有時傳遞引數)并且您回傳了另一個函式,然后該函式實作了應該做的一件事(您提到了中間件)去提醒)。
所以,我想說,如果你想要或需要或重視課程的任何好處,那么請使用課程。
如果您不想要或不需要類的任何好處并且閉包的更簡單的介面滿足您的需求,或者如果您確實需要閉包的隱私,那么您可以選擇閉包。
我想說,對于給定的情況,這些工具之一可能更“適合”手頭的問題。
正如評論中提到的,您還可以擁有可能是閉包的工廠函式(在閉包中保留私有狀態),并且可以回傳一個帶有方法和/或屬性的物件,甚至可以是通過實體化類創建的物件。因此,這些概念也可以結合起來獲得兩者的一些好處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/452230.html
標籤:javascript 班级 ecmascript-6 关闭
