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()