A JavaScript nyelvben nincsenek osztályok és öröklődés, csak
prototípusok vannak. A JavaScript-hez létezik jónéhány könyvtár amely
megpróbálja megvalósítani az osztály és az öröklés fogalmát, de
ezekkel mindig az a probléma, hogy nehézkes hozzáférni a szülő
prototípushoz, nincs "super" fogalom. A CoffeeScript-ben
kiegészítették a nyelvet a class kulcsszóval az örökléssel (extends
kulcsszó) és a super fogalommal amely megegyezik a Java super
kifejezésével.
Minden osztálynak legfeljebb egy őse
lehet, láthatóságot nem lehet megadni, minden publikus. Az osztály
törzsét a behúzás határozza meg. A tagok megadása a következő
szintaktikával megy: "tag: kif". Egy speciális tag a constructor. Ez
mint a neve is mutatja egy olyan függvényt jelöl, amely
konstruktorként lesz majd használva a példányosításkor. Legfeljebb egy
konstruktort lehet definiálni.
Az osztályokat a new kulcsszóval lehet példányosítani. A new kulcsszó után meg kell adni az osztály nevét, majd meg kell adni a konstruktor paramétereit (ha van). Az eredmény egy új objektum lesz. Erre az előző kódrészletben lehet példát találni.
A JavaScript hozzáférést biztosít az objektumok prototípusához és ezt az alacsony-szintű hozzáférést meg akarták tartani a CoffeeScript-ben is. Erre vezették be a :: operátort amit a következő szintaktikával használhatunk: "osztály::tag = kif". Az alábbi példával talán könnyebben érthető:
A JavaScriptbeli osztály fogalma elsőre nagyon furcsának tűnik és a megvalósítása bonyolult mintákat követ. A nyelv maga közvetlenül nem támogatja az osztály szemléletet. Mégis, úgy tűnik, hogy a konstruált osztályok igen hasznosak a JavaScriptben ugyanúgy mint a többi nyelvben.
A színfalak mögött a CoffeeScript a JavaScript beépített prototípusait használja hogy osztályokat készítsen; egy kevéske szintaktikai cukorkát adva a statikus tulajdonság örökléshez és kontextus perzisztenciához. Fejlesztőként ebből csak a "class" kulcsszó látszik.
A fenti példában, az Animal az osztály és az eredő változónak is a neve amit a példányosításkor használhatunk. A színfalak mögött a CoffeeScript konstruktor eljárásokat használ. Osztályokat a new kulcsszóval lehet példányosítani.
Konstruktort (olyan funkció ami a példányosításkor hívódnak meg) definiálni egyszerű, csak a "constuctor" nevű függvényt kell használnunk. Ez rokon a Ruby initalize-vel vagy a Python __init__-jével.
A CoffeeScript rövidítéseket használ a példányváltozók beállításának általános mintájára. Az argumentumot a @-jellel prefixálva, a CoffeeScript automatikusan beállítja a konstruktorban mint példánytulajdonságot. Tulajdonképpen ez a rövidítés működik a normál eljárásoknál is, osztályokon kívül. A példa alul megegyezik az utóbbi példával, ahol manuálisan állítottuk be a példány tulajdonságát.
Ahogy azt már várható, inicalizáláskor mindegyik argumentum az átadódik a konstruktornak.
További példány tulajdonságok hozzáadása az osztályhoz nagyon egyszerű, pontosan ugyanaz a szintaxis mintha tulajdonságot adnánk az objektumhoz. Csak bizonyosodjunk meg abban, hogy a tulajdonságok helyesen szerepelnek az osztály törzsében.
A kontextusok váltásai JavaScriptben mindennaposak, ahogy azt a szintaxisoknál már beszéltük. Az adott kontextust a kettős nyíl funkció jelöléssel őrizzük meg. Ez biztosítja azt, hogy bármilyen kontextusból is hívtuk meg a függvényünket, mindig abban a kontextusban fog futni amelyben az definiálva lett. A CoffeeScript kitüntetett támogatással rendelkezik a kettős nyilakkal az osztályokban. A kettős nyilak használata a példány eljárásokban biztosít minket, hogy mindig a helyes kontextusban fog meghívódni a függvény.
Ahogy az előbbi példában demonstráltuk, ez különösképp az események callback-jainál hasznos. Normális esetben a sell() függvény a #sell element kontextusában hívódna meg. Viszont, kettős nyilat használva a sell() függvénynél, biztosítjuk hogy a helyes kontextus megmarad és a this.price értéke 5-lesz.
Mi a helyzet az osztály (statikus) tulajdonságokkal? Nos, ahogy azt már láttuk, az osztály definíciójában ez az osztály objektumra mutat. Más szavakkal, osztály tulajdonságokat úgy állíthatunk be ha közvetlenül ezen objektumon állítjuk be.
Tulajdonképpen, ahogy emlékezhetünk, a CoffeeScript a this-re a @ álnevet használja, amely statikus tulajdonságokat még tömörebben írhatunk.
A programozási nyelvekben az osztályok fogalmak nem lenne teljes az öröklődés támogatása nélkül és ebben a CoffeeScript nem okoz csalódást. Az extends kulcsszóval származtathatunk egy másik osztályból A fenti példában, a "Parrot" kiterjeszti az "Animal"-t, minden példány tulajdonságát örökölve, mint például az alive() függvényt.
A fent példában felfigyelhetünk a super() kulcsszó használatára. A színfalak mögött, ez az osztály szülő prototípusának funkcióhívására fordítódik át, a helyi kontextusból meghívva. Ebben az esetben, a Parrot.__super__.constructor.call(this, "Parrot") hívódik meg; A gyakorlatban, pontosan ugyanaz történik, mint amikor a supert hívjuk meg Ruby-ban vagy Pythonban: meghívódik a felülírt örökölt funkció.
Hacsak nem írjuk fölül a konstruktort, a CoffeeScript alapértelmezetten meghívja a szülő konstruktorát amikor a példány elkészül.
A CoffeeScript prototípus másolást használ az osztály példány tulajdonságainak automatikus öröklésére. Ez azt a működést biztosítja, hogy az osztályok dinamikusak: még ha egy új tulajdonságot is adunk a szülő osztályhoz miután a gyermek elkészült, a tulajdonság propagálva lesz az összes származtatott gyermekhez.
Érdemes rámutatni, hogy a statikus tulajdonságok inkább másolódnak az alosztályokba, mintsem öröklődnének. Ez a JavaScript prototípus architektúrának implementációija miatt van, és ez egy nehéz probléma.