2013-08-30 2 views
0

В coffeescript вы можете присвоить объект или класс глобальному пространству имен, добавив определение с помощью символа @.Присвоить @ отдельному объекту для упрощения пространства имен

например.

class @Dog #This is now available via window.Dog due to the @ 
    constructor :() -> 

Но там как-нибудь, чтобы назначить @ символ на другой объект, а не окна?

Когда я попытался @ = {}, я получил error: unexpected =

Это позволит вам всегда определять свои объекты, чтобы быть пространством имен, но передумали о том, что пространство имен, которое находится в более позднее время. Это позволяет избежать экспорта в каждом отдельном случае. Во время тестирования вы можете установить значение @ на глобальное, а затем установить его в альтернативное пространство имен при развертывании.

Если есть лучший подход или альтернативный способ достижения аналогичной цели, это тоже было бы здорово!

ответ

1

не может присваивать что-то this, this является переменной сферы.

Я предполагаю вы могли бы сделать какую-то функцию, чтобы установить пространство имен:

@scope = do (-> return @) #change `@` at the end to your namespace 

Тогда вы могли бы сделать:

class @scope.Dog 
    constructor:() -> 
     ... 

, которые разбирают на:

this.scope = (function() { 
    return this; 
})(); 

this.scope.Dog = (function() { 

    function Dog() { 
     ... 
    } 

    return Dog; 

})(); 
+0

Мне нравится этот подход спасибо. Я закончил определение простого объекта 'scope = @' в верхней части кода, и с этого момента все в этом документе определяется 'scope.Dog'.Вы можете легко изменить пространство имен в любое время для всех объектов. _и читатели вашего кода могут легко увидеть, что происходит. Было ли преимущество в определении функции '@ scope' как функции (в отличие от объекта), которую я пропускаю? –

0

Вы не можете измените this на верхнем уровне, но вы c call a function с другим this объемом:

(-> 
    class @Dog 
    talk: -> console.log 'woof!' 
    class @Cat 
    talk: -> console.log 'meow' 
).call animals = {} 

# Now the animals "namespace" has a Cat and a Dog properties. 
(new scope.Cat).talk() 

пример не делает слишком много смысла, так как она может быть написана как animals = {}; class animals.Cat и избежать необходимости для этого дополнительного уровня вложенности, но если вы ищете для изменения this динамически в какой-то момент, это приятно знать о существовании Function#call :)

0

Использование @ в качестве ссылки на окна объект может ввести в заблуждение и может привести к ошибкам (при изменении контекста). Лучше объявить некоторое пользовательское пространство имен.

Вы помещаете линию в первом сценарии вы загружаете:

window.myns ?= {} 

..., а затем использовать его вместо @, как:

class myns.Dog 

Просто чтобы быть безопасным вы добавляете строка декларации пространства имен поверх каждого файла, в котором вы будете ссылаться на него. Однако это не обязательно. Просто убедитесь, что скрипты загружены в правильном порядке.

Смежные вопросы