Coffescript private and privileged methods - unders/mywiki GitHub Wiki

References

Code example 1

container = (param) ->
  @member = param

  # Private members
  secret = 3
  that = this 
  # By convention, we make a private that variable. 
  # This is used to make the object available to the private methods.
  # This is a workaround for an error in the ECMAScript Language Specification which 
  # causes this to be set incorrectly for inner functions.

  # private method 
  dec = ->
    if secret > 0
      secret -= 1
      true
    else
      false 

  # privileged method
  @service = ->
    if dec() then @member else secret  

  that

c = container("abc")
alert c.service() # => "abc"
alert c.service() # => "abc"
alert c.service() # => "abc"
alert c.service() # => 0
alert c.dec()     # => exception, TYpeError: No method dec()

# public method
c.adam = ->
  #dec() # => ReferenceError: dec is not defined
  #secret # => ReferenceError: secret is not defined
  @member

alert c.adam() # => "abc"
alert c.adam() # => "abc"

Code example 2 (Functional - JavasScript the Good parts)


# spec - The contents of the spec could be copied into private variables
#        or transformed by other functions.
# my - The my object is a container of secrets that are shared by the 
#      constructors in the inheritance chain.
cat = (spec, my) ->
  that = {}
  secret = 1
  my = my || {}

  # private methods 
  dec = ->
    if secret > 0
      secret -= 1
      true
    else
      false

  service = ->
   if dec() then spec.name else secret

  # Privileged method (public)
  that.service = service  

  return that

c = cat({ name: "abc"})
alert c.service() # => "abc"
alert c.service() # => 0
#alert c.dec()     # => exception, TYpeError: No method dec()