Как стать автором
Обновить

Комментарии 15

Эээ батенька, а как же классы в ES Harmony, следовало бы об этом хоть слово сказать вместо категорического
В ECMAScript пока отсутствует понятие «класс»

К тому же, разработчики Coffescript, работая над классами в своем языке, ориентировались именно на черновики ES Harmony.
Эээ батенька, а как же классы в ES Harmony, следовало бы об этом хоть слово сказать вместо категорического.


Именно по этой причине я и сделал акцент на слове «пока».
Если по факту, то обсуждать классы описанные в ECMAScript Harmony классы нет смысла, потому что в том виде котором они представлены в Traceur ни один из движков не поддерживает.
И несмотря на то, что их перенесли из ветки Strawman'a в драфтовой спецификации это не отображено.

К тому же, разработчики Coffescript, работая над классами в своем языке, ориентировались именно на черновики ES Harmony.


В CoffeeScript нет модификаторов доступа, а то что есть сейчас лишь условность (все это описано в статье).
Хмм, сразу видно, что вы старались и проделали немалую работу над этой статьей, но по-моему это как-то идеологически неправильно — обучать азам ООП в Javascript сразу на Coffeescript. К тому же, у меня складывается впечатление, что те, кто не знали ООП в Javascript, из этой статьи, пардон, ничерта не поймут.

+ есть критика по закрытым и защищенным членам класса в вашей статье
обучать азам ООП в Javascript сразу на Coffeescript

Эта статья ориентирована на людей которые целенаправленно изучают CoffeeScript.

PS: Более общая тема про работу с объектами в ECMAScript также планируется (написана уже большая часть)
Имхо: не зная азов ООП в Javascript, Coffeescript изучать рановато
class A
    constructor: (@param) ->
    property = 1 # private

Тогда уж не private, а static 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 доступно только для членов базового класса!


Вот это вообще бред.

1) Я могу вызвать object.__private__ 'privated' извне точно так же, как внутри методов класса.
2)
 if !@constructor.__super__ 

— вы сами понимаете смысл этой проверки? Условие будет выполнено, если у данного класса нет классов-предков, т. е. он первый в цепочке наследования, которая строится с помощью Coffeescript. Это абсолютно никак не помагает реализовать приватные свойства. Например, что мне делать, если я хочу заиметь такие вот приватные методы в классе B? Раз уж вы решили так поизвращаться, вам нужно было делать что-то типа такого:
 if arguments.callee.caller == constructor

Но Function.caller is deprecated и не работает в strict mode
Пардон, не 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


Во-первых, как вы заметили arguments.callee.caller не соответствует ECMAScript 5 (хотя eval, тоже, но я его использовал для большей ясности реализации)
Во-вторых, вы сами проверяли запускать это?

PS: Если вы найдете какие-то неточности в статье, прошу писать в ЛС, чтобы не вводить в заблуждение других.
Ок, объясню на примере: как вы предлагаете использовать этот метод __private__ для реализации закрытых или защищенных свойств в классе В, если у нас есть:
class A
class B extends A
class C extends B
?

То, что вы написали не является реализацией приватных/защищенных членов класса.

По поводу arguments.callee.caller — вот так могла бы выглядеть реализация protected static методов:
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]

Но я никак не могу рекомендовать кому-то использовать такой подход.
А вообще, завязывайте так извращаться, не нужно оно вам (я о костылях для модификаторов доступа). А новичкам в Cofeescript и подавно.

# Я об этом:
object = new A 1
console.log object.__private__ 'privated', [2]
# какой же это приватный метод?
Действительно не доглядел, спасибо что заметили.
А вообще, завязывайте так извращаться, не нужно оно вам (я о костылях для модификаторов доступа). А новичкам в Cofeescript и подавно.

Вы правы, я не сторонник таких велосипедов. Однако тот факт, что очень много статей посвященных Cofeescript пестрят заголовками о неких модификаторах доступа меня

Истинной целью описания реализации модификаторов доступа была попытка показать, что:
— при большом желании реализовать можно многое;
— не стоит принимать за правду все что пишут в большинстве статей о Cofeescript. Особенно тем статьям и книгам в которых описываются модификаторы доступа как часть языка.
You make my day!
На завтра что-то планируется? :)
На завтра что-то планируется? :)

В данный момент, готовятся еще несколько статей (темы: паттерны проектирования, функции, объекты), но когда получится дописать сложно сказать.
1. Класс — специальная синтаксическая конструкция представленная множеством обобщённых логически связанных сущностей.
2. Если давать более точно определение, то класс в CoffeeScript это абстрактный тип данных, который определяет альтернативный способ работы с объектами.

Странная размытая статья. Если второе определение более точное, почему бы именно его не указать первым?

Недавно пытался понять, почему один знакомый не понимает как использовать классы (он только учит ООП), и понял, что большинство людей пытается заучить шаблонные определения, без попыток пояснить своими словами.

Когда он сказал, что класс это набор связанных функций и данных, я понял в чем проблема.

Потому что на самом деле — наоборот.
Класс — это в первую очередь данные, а потом уже функции, которые работают именно с этими данными.

Если рассматривать именно в таком ключе, иерархия становится на свои места. Проще проектировать что где должно быть.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории