Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В ECMAScript пока отсутствует понятие «класс»
Эээ батенька, а как же классы в ES Harmony, следовало бы об этом хоть слово сказать вместо категорического.
К тому же, разработчики Coffescript, работая над классами в своем языке, ориентировались именно на черновики ES Harmony.
обучать азам ООП в Javascript сразу на Coffeescript
class A
constructor: (@param) ->
property = 1 # private
class A
constructor: (@value) ->
privated = (param) ->
@value + param
__private__: (name, param...) ->
eval(name).apply @, param if !@constructor.__super__
A::method = ->
@__private__ 'privated', 2
class B extends A
B::method = ->
@__private__ 'privated', 2
object = new A 1
object.method() # 3
object = new B 1
object.method() # undefuned
object.privated # undefuned
Как видите, член класса privated доступно только для членов базового класса!
if !@constructor.__super__
if arguments.callee.caller == constructor
@constructor
Вот это вообще бред.
1) Я могу вызвать object.__private__ 'privated' извне точно так же, как внутри методов класса.
object = new A 1
console.log object.method() # 3
object = new B 1
console.log object.__private__ 'privated' # undefuned
— вы сами понимаете смысл этой проверки? Условие будет выполнено, если у данного класса нет классов-предков, т. е. он первый в цепочке наследования, которая строится с помощью Coffeescript. Это абсолютно никак не помагает реализовать приватные свойства. Например, что мне делать, если я хочу заиметь такие вот приватные методы в классе B?
Раз уж вы решили так поизвращаться, вам нужно было делать что-то типа такого:
if arguments.callee.caller == constructor
class A
myPrivateMethod = (x)->console.log 'hello', x
myPublicMethod: (x)->
@__protected__('myPrivateMethod',[x])
__protected__: (name, args)->
isAllowed = false
for key,val of @constructor.prototype
if arguments.callee.caller == val
isAllowed = yes
unless isAllowed
console.log 'Private access only!'
return
eval(name).apply @, args
class B extends A
myPublicMethod2: ()->
@__protected__('myPrivateMethod',[2])
#test case
a = new A
b = new B
a.myPublicMethod 1
b.myPublicMethod2()
a.__protected__ 'myPrivateMethod', [3]
# Я об этом:
object = new A 1
console.log object.__private__ 'privated', [2]
# какой же это приватный метод?
А вообще, завязывайте так извращаться, не нужно оно вам (я о костылях для модификаторов доступа). А новичкам в Cofeescript и подавно.
На завтра что-то планируется? :)
CoffeeScript: Классы