84 votes

Les députés d'en CoffeeScript?

est-ce que qqn sait comment rendre privé, les membres non statiques en CoffeeScript? Actuellement, je suis en train de faire cela, qui utilise une variable publique en commençant par un trait de soulignement à préciser qu'il ne doit pas être utilisé en dehors de la classe:

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

  getName: -> @_name

Mettre la variable dans la classe en fait un membre statique, mais comment puis-je le rendre non-statique? Est-il même possible sans se faire "fantaisie"?

203voto

Vitaly Kushner Points 3975

les classes sont que des fonctions de sorte qu'ils créer des étendues. tout ce que définis à l'intérieur de ce champ ne sera pas visible de l'extérieur.

class Foo
  # this will be our private method. it is invisible
  # outside of the current scope
  foo = -> "foo"

  # this will be our public method.
  # note that it is defined with ':' and not '='
  # '=' creates a *local* variable
  # : adds a property to the class prototype
  bar: -> foo()

c = new Foo

# this will return "foo"
c.bar()

# this will crash
c.foo

coffeescript compile ce:

(function() {
  var Foo, c;

  Foo = (function() {
    var foo;

    function Foo() {}

    foo = function() {
      return "foo";
    };

    Foo.prototype.bar = function() {
      return foo();
    };

    return Foo;

  })();

  c = new Foo;

  c.bar();

  c.foo();

}).call(this);

20voto

matyr Points 4025

Est-il même possible sans se faire "fantaisie"?

C'est triste à dire, vous auriez à être de fantaisie.

class Thing extends EventEmitter
  constructor: (name) ->
    @getName = -> name

Rappelez-vous, "C'est juste du JavaScript."

11voto

Tim Wu Points 1038

J'aimerais vous montrer quelque chose d'encore plus fantaisiste

class Thing extends EventEmitter
  constructor: ( nm) ->
    _name = nm
    Object.defineProperty @, 'name',
      get: ->
        _name
      set: (val) ->
        _name = val
      enumerable: true
      configurable: true

Maintenant vous pouvez le faire

t = new Thing( 'Dropin')
#  members can be accessed like properties with the protection from getter/setter functions!
t.name = 'Dragout'  
console.log t.name
# no way to access the private member
console.log t._name

2voto

Connor Points 7403

Il y a un problème avec Vitaly la réponse et qu'il est impossible de définir des variables que vous voulez être unique pour le champ, si vous avez fait un privé nom de cette façon et puis changé, le nom de la valeur allait changer pour chaque instance unique de la classe, il y a une façon de résoudre ce problème

# create a function that will pretend to be our class 
MyClass = ->

    # this has created a new scope 
    # define our private varibles
    names = ['joe', 'jerry']

    # the names array will be different for every single instance of the class
    # so that solves our problem

    # define our REAL class
    class InnerMyClass 

        # test function 
        getNames: ->
            return names;

    # return new instance of our class 
    new InnerMyClass

Il n'est pas impossible d'accéder à l'noms de tableau à partir de l'extérieur, sauf si vous utilisez getNames

Un Test

test = new MyClass;

tempNames = test.getNames()

tempNames # is ['joe', 'jerry']

# add a new value 
tempNames.push 'john'

# now get the names again 
newNames = test.getNames();

# the value of newNames is now 
['joe', 'jerry', 'john']

# now to check a new instance has a new clean names array 
newInstance = new MyClass
newInstance.getNames() # === ['joe', 'jerry']


# test should not be affected
test.getNames() # === ['joe', 'jerry', 'john']

Compilé En Javascript

var MyClass;

MyClass = function() {
  var names;
  names = ['joe', 'jerry'];
  MyClass = (function() {

    MyClass.name = 'MyClass';

    function MyClass() {}

    MyClass.prototype.getNames = function() {
      return names;
    };

    return MyClass;

  })();
  return new MyClass;
};

1voto

Hung Vo Points 6

Voici comment vous pouvez déclarer privé, les membres non statiques en Coffeescript
Pour une référence complète, vous pouvez prendre un coup d'oeil à https://github.com/vhmh2005/jsClass

class Class

  # private members
  # note: '=' is used to define private members
  # naming convention for private members is _camelCase

  _privateProperty = 0

  _privateMethod = (value) ->        
    _privateProperty = value
    return

  # example of _privateProperty set up in class constructor
  constructor: (privateProperty, @publicProperty) ->
    _privateProperty = privateProperty

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X