У JavaScript нет традиционной системы классов. Вместо этого у него есть прототипы. Прототипы могут быть чрезвычайно универсальными и мощными, но они вводят в заблуждение новичков. Следовательно, CoffeeScript создал традиционную систему классов. Но как? Фраза CoffeeScript звучит так: «Это просто JavaScript», а в JavaScript явно отсутствует традиционная система классов. В этой статье мы рассмотрим основы создания класса CoffeeScript. В следующей статье мы рассмотрим (относительно продвинутый) сгенерированный JavaScript, чтобы выяснить, как работает магия.
Родительский класс
Мы сделаем это главным образом на примере, так как тем, кто прочитал мою вводную статью о coffeescript, будет довольно легко понять, что происходит.
class Bourgeoisie
constructor: (@age, @privilegeConstant) ->
worry: ->
console.log("My stocks are down 1%!")
profit: (hardWork, luck) ->
return (@age - 23) * hardWork * (luck + @privilegeConstant)
elite = new Bourgeoisie(29, 397)
elite.worry() # "My stocks are down 1%!"
elite.profit(20, 50) #53640
Мы объявляем класс под названием Bourgeoisie
Функции в классе объявлены следующим образом:
functionName: (arguments) ->
code
Функция конструктора называется, достаточно ясно, constructor
Он принимает два аргумента, age
priviligeConstant
@
this
Конструктор вызывается автоматически при создании новой Bourgeoisie
У нас также есть две другие функции. Первое, worry
Второй, profit
Унаследованный класс
Теперь мы хотим иметь класс, унаследованный от Bourgeoisie
Мы назовем это Senator
class Senator extends Bourgeoisie
worry: ->
console.log("The polls are down 1%!")
senator = new Senator(45, 992)
senator.worry() # "The polls are down 1%!")
senator.profit(6, 10) # 132264
Этот класс расширяет Bourgeoisie
Функции constructor
profit
Senator
Bourgeoisie
Функция worry
Senator
worry
переписывает родительское. Эта перезапись видна снова в классе Student
class Student extends Bourgeoisie
worry: ->
console.log("Does my privilege inherently make me complicit in the repression of less fortunate classes?")
profit: (hardWork, luck, tuition) ->
super(hardWork, luck) - tuition
student = new Student(21, 89)
student.worry() #"Does my privilege inherently make me complicit in the repression of less fortunate classes?"
student.profit(10, 10, 10000) #-11980
Беспокойство студента перезаписывает worry
worry
profit
Однако перезапись теперь зависит от функции profit
Он берет это и вычитает плату за обучение. Это плохое время, чтобы быть студентом! Но то, что вы действительно должны извлечь из этого, — это ключевое слово super
Но мне понравились прототипы
Повезло тебе! CoffeeScript дает вам удобство, но все же оставляет вам силы. Давайте использовать это! Вот наш сокращенный пример из прошлого раза :
object = (o) ->
F = ->
F.prototype = o
new F()
soldier = new Object()
soldier.a = jump
soldier.r = machineGun
sniper = object(soldier)
sniper.r = snipe
woundedSniper = object(sniper)
woundedSniper.a = -> console.log('aaaargh my leg!')
woundedSoldier = object(soldier)
woundedSoldier.a = woundedSniper.a
Это должно показаться знакомым, потому что 90% изменений заменяли несколько function
Прототипная система наследования не тронута, потому что, помните, CoffeeScript — это просто JavaScript. Синтаксис чище, и больше нечему учиться, если вы хотите реализовать прототипы в стиле Брендана Эйха, который мы использовали в прошлый раз. Это не значит, что CoffeeScript не применяет некоторые сочетания клавиш. Вы можете использовать ::
prototype
Однако в стиле прототипов в стиле Брендана Эйха мы должны использовать его только один раз в методе object(o)
Мы также можем получить доступ к ключевым словам extends
super
object(o)
Вывод
Классическая система наследования в CoffeeScript обеспечивает удобство и комфорт для среднего разработчика. Кроме того, более чистый синтаксис CoffeeScript делает реализацию настоящей прототипной системы немного проще. Там просто нет возможности проиграть.