CoffeeScript, реализующий «инструменты» - PullRequest
7 голосов
/ 29 ноября 2011

CoffeeScript - это фантастика, система классов - это действительно весь когда-либо необходимый javascript, несколько ключевых слов и намного меньше прото * и скобок повсюду.Я видел, как люди реализуют миксины в классах, но мне интересно, есть ли путь к реализации аналогии с интерфейсами Java?

Если нет, то это может быть хорошим дополнением .. В конце концов, это было быхорошо знать, может ли мой код успешно ходить / крякать как утка во время компиляции.Следующие инструкции могли бы лучше помочь тому, что было бы идеально ... Сейчас вы можете обойти это, создавая модульные тесты (которые вы должны делать в любом случае), так что это не такая уж большая проблема, но все равно было бы неплохо.*

Ответы [ 3 ]

8 голосов
/ 30 ноября 2011

Как правило, JavaScripters отвергают Java-измы как интерфейсы. В конце концов, полезность интерфейсов заключается в том, что они проверяют, «объекты крякают, как утка» во время компиляции, а JavaScript не является компилируемым языком. CoffeeScript есть, но такие вещи, как применение интерфейсов, выходят далеко за его рамки. Более строгий язык компиляции для JS, такой как Dart, может оказаться более подходящим для вас.

С другой стороны, если вы хотите сделать featurex и featurey как mixins , это то, что довольно распространено и легко сделать в CoffeeScript-land. Возможно, вы захотите взглянуть на главу классов в Маленькая книга по CoffeeScript, , в которой показано, как легко это сделать: просто определите featurex как объект, методы которого Вы добавляете к прототипу childa.

6 голосов
/ 17 ноября 2015

Я знаю, что опоздал на вечеринку.Я не буду спорить о преимуществах почему / почему не делать этого, так как это всего лишь инструмент в наборе инструментов вашего разработчика, но вот как я это делаю:

class.coffee

# ref - http://arcturo.github.io/library/coffeescript/03_classes.html#extending_classes
# ref - http://coffeescriptandnodejs.blogspot.com/2012/09/interfaces-nested-classes-and.html

#
# @nodoc
#
classKeywords = ['extended', 'included', 'implements', 'constructor']

#
# All framework classes should inherit from Class
#
class Class

    #
    # Utility method for implementing one of more mixin classes.
    #
    # @param objs [Splat] One or more mixin classes this class will *implement*.
    #
    @implements: (objs...) ->
        for obj in objs
            if typeof obj is 'function' and Boolean(obj.name)
                obj = obj.prototype

            for key, value of obj #when key not in moduleKeywords
                # Assign properties to the prototype
                if key not in classKeywords
                    #console.log 'implementing', value.toString(), 'as', key
                    @::[key] = value

            obj.included?.apply(@)
        this

    #
    # Utility method for adding getter/setters on the Class instance
    #
    # @param prop [String] The name of the getter/setter.
    # @param desc [Object] The object with a getter &/or setter methods defined.
    #
    @property: (prop, desc)-> Object.defineProperty @prototype, prop, desc

interface.quack.coffee

class iQuack 
    quack: -> throw new Error 'must implement interface method'

duck.coffee

class Duck extends Class 
    @implements iQuack

    quack: -> console.log 'quack, quack'

https://gist.github.com/jusopi/3387db0dd25cd11d91ae

1 голос
/ 11 сентября 2012

У меня та же проблема, и я пытался ее решить, добавив метод includes к Function. Я описал это здесь . Это решение позволяет реализовать несколько интерфейсов и предоставляет дополнительный метод для Object прототипа, который можно использовать вместо оператора instanceof (так как мы не можем переопределить любой оператор JavaScript).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...