Статьи

Классы в CoffeeScript

У 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 Он принимает два аргумента, agepriviligeConstant@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 Функции constructorprofitSenatorBourgeoisie

Функция worry Senatorworryпереписывает родительское. Эта перезапись видна снова в классе 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

Беспокойство студента перезаписывает worryworryprofit Однако перезапись теперь зависит от функции 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) Мы также можем получить доступ к ключевым словам extendssuperobject(o)

Вывод

Классическая система наследования в CoffeeScript обеспечивает удобство и комфорт для среднего разработчика. Кроме того, более чистый синтаксис CoffeeScript делает реализацию настоящей прототипной системы немного проще. Там просто нет возможности проиграть.