CoffeeScript ([’kɔ:fɪ skrɪpt]; кофи скрипт) — язык программирования, транслируемый в JavaScript. CoffeeScript добавляет синтаксический сахар в духе Ruby, Python, Haskell и Erlang для того, чтобы улучшить читаемость кода и уменьшить его размер. CoffeeScript позволяет писать более компактный код по сравнению с JavaScript. JavaScript-код, получаемый трансляцией из CoffeeScript, полностью проходит проверку JavaScript Lint.
История
Создателем языка является Джереми Ашкенас.
Изначально компилятор был написан на Ruby, но в версии 0.5, которая вышла 21 февраля 2010 года, компилятор был реализован на самом же CoffeeScript.
CoffeeScript был радушно воспринят в Ruby-сообществе. Встроенная поддержка CoffeeScript была добавлена в веб-фреймворк Ruby on Rails с версии 3.1.
Реализация
На официальном сайте языка есть раздел «try coffeescript», позволяющий выполнять программы на нём online. В отличие, к примеру, от Try Ruby, при этом не будет происходить запросов к серверу, код компилируется и исполняется непосредственно в браузере.
Примеры
Переменные
CoffeeScript:
age = 2 male = true name = "Матвей"JavaScript:
var age = 2, male = true, name = "Матвей";Функции
CoffeeScript:
say = (speech) -> alert speech say "Привет мир!"JavaScript с использованием ECMAScript 2015:
const say = speech => alert(speech); say('Привет мир!');JavaScript:
var say = function(speech) { alert(speech); }; say("Привет мир!");Классы и объекты
CoffeeScript:
class Human constructor : (@name) -> class Baby extends Human say : (msg) -> alert "#{@name} говорит '#{msg}'" sayHi : -> @say('здравствуй!') matt = new Baby("Матвей") matt.sayHi()JavaScript с использованием ECMAScript 2015:
class Human { constructor(name) { this.name = name; } } class Baby extends Human { say(msg) { alert(`${this.name} говорит '${msg}'`); } sayHi() { this.say('здравствуй!'); } } const matt = new Baby('Матвей'); matt.sayHi();Аналог на JavaScript (именно аналог, а не результат компиляции):
function Human(name){ this.name = name; } function Baby(name){ Human.call(this, name); } Baby.prototype = Object.create(Human.prototype); Baby.prototype.say = function(msg){ alert(this.name + ' говорит ' + msg); }; Baby.prototype.sayHi = function(){ this.say('здравствуй!'); }; Baby.prototype.constructor = Human; var matt = new Baby("Матвей"); matt.sayHi();Примечание: в JavaScript при работе с «классами» (конструктор + прототипы + функции для наследования и смешивания) часто используют обёртки (MooTools, AtomJS и другие). Аналогия на JavaScript с классовой обёрткой AtomJS:
var Human = Class({ initialize : function(name) { this.name = name; } }); var Baby = Class({ Extends : Human, say : function(msg) { alert(this.name + ' говорит ' + msg); }, sayHi : function() { this.say('здравствуй!'); } }); var matt = new Baby("Матвей"); matt.sayHi();Пример класса CoffeeScript с различными видами свойств.
class Test say = (msg) -> alert msg # приватный метод @echo = (msg) -> console.log msg # статический метод, записан в Test setHi : (msg) -> # динамический метод, записан в Test.prototype @hi = -> msg # динамический метод, записан в экземпляр Test