核心要點
JavaScript 沒有傳統的類系統,而是使用原型。原型非常靈活且功能強大,但對於初學者來說很令人困惑。因此,CoffeeScript 創建了一個傳統的類系統。但是……它是如何做到的呢? CoffeeScript 的口號是“它只是 JavaScript”,而 JavaScript 明顯缺少傳統的類系統。在本文中,我們將介紹創建 CoffeeScript 類的基礎知識。在下一篇文章中,我們將深入研究生成的 JavaScript(相對高級),以了解其背後的魔力。
父類
我們將主要通過示例進行講解,因為對於那些閱讀過我的 CoffeeScript 入門文章的人來說,應該很容易理解正在發生的事情。
<code class="language-coffeescript">class Bourgeoisie constructor: (@age, @privilegeConstant) -> worry: -> console.log("我的股票下跌了 1%!") profit: (hardWork, luck) -> return (@age - 23) * hardWork * (luck + @privilegeConstant) elite = new Bourgeoisie(29, 397) elite.worry() # "我的股票下跌了 1%!" elite.profit(20, 50) # 53640</code>
我們聲明了一個名為 Bourgeoisie 的類。類的函數聲明如下:
<code class="language-coffeescript">functionName: (arguments) -> code</code>
構造函數命名為 constructor。它接受兩個參數,age 和 privilegeConstant,並自動將它們賦值為實例變量(@ 是 CoffeeScript 中 this 的替代,在構造函數的參數中使用時會自動將變量賦值給實例)。當您創建一個新的 Bourgeoisie 時,構造函數會自動調用,就像代碼示例底部一樣。我們還有另外兩個函數。第一個函數 worry 不接受任何參數。第二個函數 profit 接受兩個參數並返回一個數字。
繼承類
現在,我們想要一個繼承自 Bourgeoisie 的類。我們將其命名為 Senator。
<code class="language-coffeescript">class Senator extends Bourgeoisie worry: -> console.log("民调下跌了 1%!") senator = new Senator(45, 992) senator.worry() # "民调下跌了 1%!" senator.profit(6, 10) # 132264</code>
這個類擴展了 Bourgeoisie,這意味著它具有父類的所有特性。構造函數和 profit 函數完全相同,唯一的區別是構造實例時,您調用的是 Senator 而不是 Bourgeoisie。另一方面,worry 函數有所不同。 Senator 比股票更擔心民調,因此他的 worry 覆蓋了父類的 worry。在下面顯示的 Student 類中,再次可以看到這種覆蓋。
<code class="language-coffeescript">class Bourgeoisie constructor: (@age, @privilegeConstant) -> worry: -> console.log("我的股票下跌了 1%!") profit: (hardWork, luck) -> return (@age - 23) * hardWork * (luck + @privilegeConstant) elite = new Bourgeoisie(29, 397) elite.worry() # "我的股票下跌了 1%!" elite.profit(20, 50) # 53640</code>
學生的 worry 覆蓋了父類的 worry(比 Senator 的方式更戲劇化),他們的 profit 也被覆蓋了。但是,覆蓋現在取決於父類的 profit 函數。它採用該函數並減去學費。對學生來說,這是個艱難的時期!但你真正應該從中學到的是 super 關鍵字,它調用父類的函數版本。
但是,我喜歡原型
很好! CoffeeScript 為您提供便利,但它仍然為您提供強大的功能。讓我們使用它!這是我們上次的簡略示例:
<code class="language-coffeescript">functionName: (arguments) -> code</code>
這應該看起來很熟悉,因為 90% 的更改是將一些函數替換為尖箭頭。原型繼承系統保持不變,因為請記住,CoffeeScript 只是 JavaScript。語法更簡潔,如果您想以我們上次使用的 Brendan Eich 風格實現原型,則無需學習更多內容。這並不是說 CoffeeScript 沒有應用一些快捷方式。您可以使用 :: 代替 prototype。但是,在 Brendan Eich 風格的原型中,我們只需要在 object(o) 方法中使用一次。我們還可以訪問 extends 和 super 關鍵字,但這些關鍵字僅在構造函數中使用——我們再次將其隱藏在 object(o) 方法中。
結論
CoffeeScript 中的經典繼承系統為普通開發人員提供了便利和舒適。此外,CoffeeScript 更簡潔的語法使得實現真正的原型系統更容易一些。總之,只有好處沒有壞處。
關於 CoffeeScript 類的常見問題
CoffeeScript 中的類是一個基本概念,有助於組織和構建代碼。它們提供了一種創建具有特定屬性和方法的對象的方法。類使創建複雜的數據結構更容易,並提供了一種將數據和功能封裝在一個地方的方法。它們還支持繼承,允許您創建一個繼承自現有類的新的類。這可以大大減少代碼重複並提高代碼的可維護性。
在 CoffeeScript 中定義類很簡單。您使用 class 關鍵字後跟類名。例如,class MyClass。然後,您可以使用 @ 符號引用類的實例來在類中定義屬性和方法。例如,@myProperty 將定義類的屬性,而 @myMethod: -> 將定義方法。
CoffeeScript 中的繼承是使用 extends 關鍵字實現的。當您定義一個類時,您可以指定它擴展另一個類。這意味著新類將繼承它擴展的類的所有屬性和方法。例如,class MySubClass extends MyClass 將創建一個繼承自 MyClass 的新類。
是的,您可以在 CoffeeScript 的子類中覆蓋方法。當您在子類中定義與超類中方法同名的一個方法時,將使用子類的方法。如果您仍然想調用超類的方法,可以使用 super 關鍵字。
要在 CoffeeScript 中創建類的實例,您可以使用 new 關鍵字後跟類名。例如,myInstance = new MyClass 將創建 MyClass 的一個新實例。
CoffeeScript 類中的構造函數方法是一個特殊的方法,當創建類的新的實例時會被調用。它通常用於初始化類的屬性。在 CoffeeScript 中,構造函數方法是使用 constructor 關鍵字定義的。
CoffeeScript 不內置支持私有屬性和方法。但是,您可以通過使用閉包或在構造函數方法中定義屬性和方法來實現類似的效果,這使得它們只能在類的實例內訪問。
要在 CoffeeScript 中調用類實例上的方法,您可以使用 . 運算符後跟方法名。例如,myInstance.myMethod() 將調用 myInstance 對像上的 myMethod 方法。
是的,您可以在 CoffeeScript 中定義類之後向類添加屬性和方法。您可以通過在類的原型上定義它們來實現。例如,MyClass::myNewMethod = -> 將向 MyClass 添加一個新方法。
要在 CoffeeScript 中檢查類實例的類型,您可以使用 instanceof 運算符。例如,myInstance instanceof MyClass 如果 myInstance 是 MyClass 的實例,則返回 true。
以上是咖啡網中的課的詳細內容。更多資訊請關注PHP中文網其他相關文章!