Нужно ли в javascript думать о private свойствах и методах?
Третий день я сижу и читаю, но придти самостоятельно к ответу не смогу, но очень надеюсь что вы мне сможете помочь.
Впитав концепцию классов в других языках, мне очень сложно себя перестроить. На первый взгляд, как мне казалось, очень легкий и простой js, превратился для меня в болото, из которого я только выбравшись, попадаю снова. И для меня самое сложное было не контекст и прототипное наследование, а отсутствие классов и модификаторов доступа.
С первого дня я смерился с отсутствием private, но что-то тянуло меня разобраться и я с Вашей помощью выяснил, что private все же можно воссоздать, но и это меня тоже не успокоило. Сегодня я полез на githab и начал смотреть код известных фраймворков и не увидел там приватных свойств.
И этот факт подтолкнул меня задать этот вопрос, но прежде я немножечко расскажу, что я хочу услышать.
Бывает так, что новички, в языках с которыми я знаком, спрашивают вещи, которые я бы никогда не сделал и я всегда объясняю, что это противоречит тому-то или тому-то и говорю, как бы сделал я. Но иногда бывает так, что просто даю им ответ и что они там с этим делать будут, мне безразлично.
И теперь и я хочу спросить - нужно ли заморачиваться на private в js
или стоит принять за правило, что в js просто не нужны эти приваты?
Когда я спрашиваю "нужны ли приваты", то подразумеваю не какой-то частный случай, а спрашиваю "нужно ли, как под копирку, создавать все объекты с приватными свойствами и методами, как если бы я это делал в языках с классами?"
Или же private нужно и Вы сами применяете только в частных случаях?
Инкапсуляция это всегда хорошо. Вопрос в том нужны ли вам приватные методы и свойства? Они хороши в контексте классов, что бы разграничить интерфейс и реализацию. В JS же объект является интерфейсом. То есть он не может иметь скрытого состояния. Точнее может но не в самом объекте, а в другом каком...
В Python-мире есть такая точка зрения по поводу отсутствия модификаторов досупа, которая выражается выражением "We're all consenting adults here" (все мы тут взрослые люди). То есть по мнению большинства поставить _ перед названием приватных методов достаточно что бы разработчики их не использовали. В JS даже это крайне не рекомендуется делать, так как у вас есть скоупы и все что нужно спрятать вы можете сокрыть там. Так же в ES6 появится WeakMap которые помогут хоть немного упростить разруливание скрытого состояния и уменьшит вероятность утечек памяти.
Если посмотреть на фреймворки, например AngularJS активно использует $$ перед именем приватного свойства или метода. Причем в добавох в jsdoc эти свойства отмечены как private и если указать соответствующие опции для минификаторов, то те переименуют эти свойства и тогда разработчику будет уже тяжело предсказать как оно будет называться в следующем релизе.
Хочу уточнить - не рекомендуется создавать приватные свойства и методы или не рекомендуется создавая псевдоприватные свойства,
начинать их с _подчеркивания?
@vasIvas: вы не можете создать приватные методы и свойства, следовательно вы можете только добавлять какие-то символы вроде _ к именам методов и свойств. Именно это и не рекомендуется. Сокрыть состояние или методы можно закрыв их в своей области видимости к которой имеет доступ только методы объекта.
Инкапсуляция это всегда хорошо. Вопрос в том нужны ли вам приватные методы и свойства? Они хороши в контексте классов, что бы разграничить интерфейс и реализацию. В JS же объект является интерфейсом. То есть он не может иметь скрытого состояния.
Сергей Протько: ещё вопрос - давая совет новичку в as3 о классах, я бы описал модель из первой вспомнившейся книги И.. Вот все что после И нужно разложить более детально, так как объяснив ему стандартную формулировку я бы не соврал и подал информацию в том виде, в котором новичок бы смог её переварить. Но есть и другая сторона, я лично редко использую стандартную модель, так как у меня есть кучи фабрик, которые работают с Assetmanager, у которого я и забираю по Enum константе или строковому значению, то что мне нужно.
Вот и мне у Вас хочется спросить - Вы сами пишите простыми объектами или у Вас есть реализации классов или фабрики, которые и объект и scope его создают и контролируют?
@vasIvas: scope контролировать у вас не выйдет. Я думаю вам стоит перестать загоняться и заниматься сравнением AS3 и JS. Это принципиально разные языки, смиритесь с этим. Если хотите еще мозг полапать - возьмите rust или haskell побаловаться.
Сергей Протько: я специально делаю упор на классы, только для того, чтобы подробно все разузнать. Вот если бы я начал изучать язык с классами, то я бы знал что нужно спрашивать и отвечающие бы меня понимали, а в js я не могу спросить то, о чем ещё не подозреваю. Я делал несколько попыток, но безуспешно и на этот раз я решил спрашивать так, как могу. И ещё настроен разобраться до конца, по этому я задам ещё несколько вопросов.
@vasIvas: как по мне делать упор на классы при изучения языка, где их нет... это как-то странно. Вы в итоге будете делать неверные выводы и не усвоите идею языка.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.