Частные участники в CoffeeScript? - PullRequest
85 голосов
/ 14 января 2011

Кто-нибудь знает, как сделать частные нестатические элементы в CoffeeScript?В настоящее время я делаю это, которая просто использует открытую переменную, начинающуюся с подчеркивания, чтобы уточнить, что ее нельзя использовать вне класса:

class Thing extends EventEmitter
  constructor: (@_name) ->

  getName: -> @_name

Помещение переменной в класс делает ее статическойчлен, но как я могу сделать его нестатичным?Возможно ли это даже без "фантазии"?

Ответы [ 11 ]

0 голосов
/ 14 января 2011

Поскольку сценарий кофе компилируется в JavaScript, единственный способ иметь закрытые переменные - через замыкания.

class Animal
  foo = 2 # declare it inside the class so all prototypes share it through closure
  constructor: (value) ->
      foo = value

  test: (meters) ->
    alert foo

e = new Animal(5);
e.test() # 5

Это скомпилируется через следующий JavaScript:

var Animal, e;
Animal = (function() {
  var foo; // closured by test and the constructor
  foo = 2;
  function Animal(value) {
    foo = value;
  }
  Animal.prototype.test = function(meters) {
    return alert(foo);
  };
  return Animal;
})();

e = new Animal(5);
e.test(); // 5

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

...