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

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

очень интересно, спасибо ))
Изложение своеобразное у тебя) но полезность бесспорна)
Хвалю, хорошо написано (ну, за исключением мелких помарок).
Да и оформлено отлично, приятно.
Про добавление метода примитивному значению.
Это ограничение, наложенное JavaScript на переменные (объекты), созданные через строковые,

Это не ограничение, это запаковка примитива в объект.

var srt1 = "Литерал";
str1.tell = "Свойство";

При попытке доступа к свойству (как получения, так и установки) примитивного значения, создается объект, соответствующий этому примитиву и работа продолжается с ним. После нужных действий он удаляется. Значение же самой изначальной переменной не затрагивается.
В JavaScript нет встроенной поддержки наследования (как собсвенно нет в нем и классов). Однако наследование можно реализовать (эмулировать) вручную, пользуясь услугами свойства .prototype.

В javascript есть полноценное встроенное наследование — наследование на основании цепочки прототипов. Если не пытаться подогнать JS-парадигму под более привычную большинству (с классами), то и эмулировать ничего не нужно.
Все таки, я бы не стал так смело говорить о существовании в JS "наследования на основании цепочки прототипов". Да конечно, наследование мы строим, пользуясь этой "всемогущей цепочкой", однако для этого приходится изрядно попотеть - например для того, чтобы решить две важнейшие проблемы:
1. конструктор надкласса не должен вызываться еще до создания объекта подкласса
2. методы надкласса не должны перезаписываться одноименными методами подкласса

Если же пользоваться .prototype напрямую, как в книжках написано (да хоть в тойже "Javascript: The Definitive Guide, By David Flanagan"), то ничего не получится и более или менее интересных вещей реализовать не удастся
Интересные вещи реализуются просто и безболезненно :) Только нужно понять саму суть JS-парадигмы и полюбить её )
Конструктор надкласса не должен вызываться до создания объекта подкласса, по одной только причине — тут не должно быть никаких "надклассов" и "подклассов". Есть только объекты. Чистые и незамутненные :-D
а пояснить не можете? по поводу чистых и незамутненных! (= может ссылкой какой-нибудь? (=

дело в том, что когда я залез в разные модные js библиотеки, то не нашел там нормальной реализации наследования =( Везде этот метод .extend, который тупо копирует свойства и методы родителя, а не пользуется этими методами напрямую. Вот в prototype.js только в последней версии кажется была предпринята попытка сделать наследование с человеческим лицом.

Не о таких вы говорите объектах? (=
Больших знатоков JS тут же минусовали на Хабре, после того, как они осмеливались высказать своё мнение о "модных js-библиотеках", в том числе и о prototype.js. Так что я промолчу, тем более знаток я не такой большой.
Единственное, эти библиотеки отнюдь не то, на чем нужно позновать суть JS.
"Наследование", в своей основе, если отрешиться от всех реализаций и тому подобного, это всего лишь удобный способ строить похожие объекты на основании существующего шаблона. По сути еще одна ипостась повторного использования кода и ничего больше.
Через связь с объектом-прототипом мы получаем доступ (наследуем) к определенном в нем данным и функциям. Вот и всё наследование.
Опять начинаются главные огрехи подобных статей:
1. Говорить о классах, там где их нет. Да, вы их будете эмулировать, но об этом нужно сразу сказать читателю.
2. Начинать рассказ о сути ООП с технических деталей, типа, конструкторов, относящихся только к одному этапу - созданию объекта.
Самая суть ООП в JS, да и еще много чего в JS — цепочка областей видимости, это бы подробно для новичков и описать.
Да, суть и необходимость ООП в JS необходимо всякий раз прояснять, это точно, надо дорабатывать семинар (=
Однако простите, не понял, что вы имеете в виду под "Говорить о классах, там где их нет"?
Всё о том же. В JS нет классов. В перемешали вместе понятие "класс" и "прототип".
НЛО прилетело и опубликовало эту надпись здесь
Опять-таки что считать "классами" :)
Например, в PHP тоже, кажется, "классическое" ООП и классы, как у людей. Однако, объекту можно добавить новое свойство.
НЛО прилетело и опубликовало эту надпись здесь
А это не хак, уверяю вас :)
Просто нужно понимать как всё работает и "откуда взялось это поле".
ООП в PHP вполне годится, чтобы на средних проектах работать в ООП-стиле со всеми его преимуществами. А вся эта высокая болтовня о "стандартах ООП" и другом, дело десятое.
НЛО прилетело и опубликовало эту надпись здесь
Ну, то что на языке можно писать отстойно, не значит, что нельзя лучше :)
НЛО прилетело и опубликовало эту надпись здесь
Все это ж называется динамическими классами. Т.е. классами, в объекты которых можно "налету" добавлять новые свойства и методы, не опредленные в самом конструкторе. Разве нет? (=
НЛО прилетело и опубликовало эту надпись здесь
Упущена важная часть в описании .consturctor и .prototype.
Объекты связаны с прототипами внутренним свойством [[prototype]], которое невозможно изменить и в большинстве реализаций даже получить.
А не по цепочке obj.constructor.prototype.
Многие пытаются по этой цепочки дойти до корневого объекта или даже динамически изменить прототип объекта и очень удивляются, когда не получается.
А как всё-таки дойти до корневого объекта если [[prototype]] не доступно?
статья хорошая.
типа "я напомню :), а дальше вы и сами разберётесь"
пару ссылок на тематические статьи не помешало бы.
например
- для новичков не совсем ясно как объявлять private или public элементы класса
- как именно делать наследование.
конечно есть гугл, но всё таки.
а как же - простите - ссылки имеются в нормальном количестве (=
ООП в JavaScript (5): Полезные ссылки
ой. простите. не заметил. забираю слова назад :)
classes are poor man's closures ©
; )
Похоже на реферат статей Котерова :)
нет, это конечно же реферерат, но из разных источников, и потом я пользовался собственной логикой изложения (исходя из собственного опыта понимания этого всего) (=
НЛО прилетело и опубликовало эту надпись здесь
есть js-библиотеки, позволяющие описывать классы, цепочки наследования и интерфейсы. вот например одна из вариантов http://forum.agiledev.ru/index.php?t=msg&th=995
Ну вообще автор не библиотеку писал, а пытался донести основы механизмов.
А, почему, кстати, не в блоге JavaScript?
не нашел такого блога ((=
Извините, а что тут нового относительно тех же наблов? Помоему наблы 38-40 это всё прекрасно освящают. Их не читал только самый ленивый.
К сожалению, не совсем прекрасно.
Гораздо прекрасней освящают комментарии к ним.
например?
Почитайте комментарии к этим статьям. Особенно, к статье о наследовании.
Почитал, на первых страницах ДК говорит о том чтобы читали внимательней наблу, а потом жуткий оффтоп...
Среди этого офтопа изредка рассыпаны крупицы знания )
Особенно в постах Zeroglif'а.
Так же далеко не здорово написана набла по замыканиям с попытками связать с Перлом.
Согласен, с перлом я бы связывать не стал.
Вообще Вы правы, нет ни одной статьи об ООП в JS, в которой было бы всё прекрасно.
Лично мои знания в этой области основаны на совокупности многих статей и личного опыта.
А интерес к этой тематики возбудили именно наблы.
А мой интерес во многом комментарии к ним :)
Недописано.
http://disaen.com/misc/inheritance/
Какое множественно наследование?
__proto__ только для FF и то далеко не всегда.
__proto__ в статье используется только для демонстрации доводов. Всё остальное делается стандартными средствами. Почитайте, пожалуйста, чуть внимательнее :)
Перечитал. Да, действительно:
По стандарту оно недоступно для просмотра и редактирования, но, к счастью, Firefox любезно предоставляет к нему доступ через __proto__

извините.

Но множественного наследования всё равно не увидел.
Несогласованность термина. Убрал, чтобы не смущало.
В общем и целом - ясная и доходчивая статья. Дописывайте, линкуйте к хабру, будем сглаживать шероховатости. ;)
Спасибо за помощь, как карма позволит — выложу.
Теперь позволяет?
Ога, спасибо :)
Спасибо большое, очень полезно!
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.