Comments 54
очень интересно, спасибо ))
Изложение своеобразное у тебя) но полезность бесспорна)
Хвалю, хорошо написано (ну, за исключением мелких помарок).
Да и оформлено отлично, приятно.
Да и оформлено отлично, приятно.
Про добавление метода примитивному значению.
Это не ограничение, это запаковка примитива в объект.
При попытке доступа к свойству (как получения, так и установки) примитивного значения, создается объект, соответствующий этому примитиву и работа продолжается с ним. После нужных действий он удаляется. Значение же самой изначальной переменной не затрагивается.
Это ограничение, наложенное JavaScript на переменные (объекты), созданные через строковые,
Это не ограничение, это запаковка примитива в объект.
var srt1 = "Литерал";
str1.tell = "Свойство";
При попытке доступа к свойству (как получения, так и установки) примитивного значения, создается объект, соответствующий этому примитиву и работа продолжается с ним. После нужных действий он удаляется. Значение же самой изначальной переменной не затрагивается.
В JavaScript нет встроенной поддержки наследования (как собсвенно нет в нем и классов). Однако наследование можно реализовать (эмулировать) вручную, пользуясь услугами свойства .prototype.
В javascript есть полноценное встроенное наследование — наследование на основании цепочки прототипов. Если не пытаться подогнать JS-парадигму под более привычную большинству (с классами), то и эмулировать ничего не нужно.
Все таки, я бы не стал так смело говорить о существовании в JS "наследования на основании цепочки прототипов". Да конечно, наследование мы строим, пользуясь этой "всемогущей цепочкой", однако для этого приходится изрядно попотеть - например для того, чтобы решить две важнейшие проблемы:
1. конструктор надкласса не должен вызываться еще до создания объекта подкласса
2. методы надкласса не должны перезаписываться одноименными методами подкласса
Если же пользоваться .prototype напрямую, как в книжках написано (да хоть в тойже "Javascript: The Definitive Guide, By David Flanagan"), то ничего не получится и более или менее интересных вещей реализовать не удастся
1. конструктор надкласса не должен вызываться еще до создания объекта подкласса
2. методы надкласса не должны перезаписываться одноименными методами подкласса
Если же пользоваться .prototype напрямую, как в книжках написано (да хоть в тойже "Javascript: The Definitive Guide, By David Flanagan"), то ничего не получится и более или менее интересных вещей реализовать не удастся
Интересные вещи реализуются просто и безболезненно :) Только нужно понять саму суть JS-парадигмы и полюбить её )
Конструктор надкласса не должен вызываться до создания объекта подкласса, по одной только причине — тут не должно быть никаких "надклассов" и "подклассов". Есть только объекты. Чистые и незамутненные :-D
Конструктор надкласса не должен вызываться до создания объекта подкласса, по одной только причине — тут не должно быть никаких "надклассов" и "подклассов". Есть только объекты. Чистые и незамутненные :-D
а пояснить не можете? по поводу чистых и незамутненных! (= может ссылкой какой-нибудь? (=
дело в том, что когда я залез в разные модные js библиотеки, то не нашел там нормальной реализации наследования =( Везде этот метод .extend, который тупо копирует свойства и методы родителя, а не пользуется этими методами напрямую. Вот в prototype.js только в последней версии кажется была предпринята попытка сделать наследование с человеческим лицом.
Не о таких вы говорите объектах? (=
дело в том, что когда я залез в разные модные js библиотеки, то не нашел там нормальной реализации наследования =( Везде этот метод .extend, который тупо копирует свойства и методы родителя, а не пользуется этими методами напрямую. Вот в prototype.js только в последней версии кажется была предпринята попытка сделать наследование с человеческим лицом.
Не о таких вы говорите объектах? (=
Больших знатоков JS тут же минусовали на Хабре, после того, как они осмеливались высказать своё мнение о "модных js-библиотеках", в том числе и о prototype.js. Так что я промолчу, тем более знаток я не такой большой.
Единственное, эти библиотеки отнюдь не то, на чем нужно позновать суть JS.
"Наследование", в своей основе, если отрешиться от всех реализаций и тому подобного, это всего лишь удобный способ строить похожие объекты на основании существующего шаблона. По сути еще одна ипостась повторного использования кода и ничего больше.
Через связь с объектом-прототипом мы получаем доступ (наследуем) к определенном в нем данным и функциям. Вот и всё наследование.
Единственное, эти библиотеки отнюдь не то, на чем нужно позновать суть JS.
"Наследование", в своей основе, если отрешиться от всех реализаций и тому подобного, это всего лишь удобный способ строить похожие объекты на основании существующего шаблона. По сути еще одна ипостась повторного использования кода и ничего больше.
Через связь с объектом-прототипом мы получаем доступ (наследуем) к определенном в нем данным и функциям. Вот и всё наследование.
Опять начинаются главные огрехи подобных статей:
1. Говорить о классах, там где их нет. Да, вы их будете эмулировать, но об этом нужно сразу сказать читателю.
2. Начинать рассказ о сути ООП с технических деталей, типа, конструкторов, относящихся только к одному этапу - созданию объекта.
Самая суть ООП в JS, да и еще много чего в JS — цепочка областей видимости, это бы подробно для новичков и описать.
1. Говорить о классах, там где их нет. Да, вы их будете эмулировать, но об этом нужно сразу сказать читателю.
2. Начинать рассказ о сути ООП с технических деталей, типа, конструкторов, относящихся только к одному этапу - созданию объекта.
Самая суть ООП в JS, да и еще много чего в JS — цепочка областей видимости, это бы подробно для новичков и описать.
Да, суть и необходимость ООП в JS необходимо всякий раз прояснять, это точно, надо дорабатывать семинар (=
Однако простите, не понял, что вы имеете в виду под "Говорить о классах, там где их нет"?
Однако простите, не понял, что вы имеете в виду под "Говорить о классах, там где их нет"?
Всё о том же. В JS нет классов. В перемешали вместе понятие "класс" и "прототип".
Опять-таки что считать "классами" :)
Например, в PHP тоже, кажется, "классическое" ООП и классы, как у людей. Однако, объекту можно добавить новое свойство.
Например, в PHP тоже, кажется, "классическое" ООП и классы, как у людей. Однако, объекту можно добавить новое свойство.
А это не хак, уверяю вас :)
Просто нужно понимать как всё работает и "откуда взялось это поле".
ООП в PHP вполне годится, чтобы на средних проектах работать в ООП-стиле со всеми его преимуществами. А вся эта высокая болтовня о "стандартах ООП" и другом, дело десятое.
Просто нужно понимать как всё работает и "откуда взялось это поле".
ООП в PHP вполне годится, чтобы на средних проектах работать в ООП-стиле со всеми его преимуществами. А вся эта высокая болтовня о "стандартах ООП" и другом, дело десятое.
Все это ж называется динамическими классами. Т.е. классами, в объекты которых можно "налету" добавлять новые свойства и методы, не опредленные в самом конструкторе. Разве нет? (=
Упущена важная часть в описании .consturctor и .prototype.
Объекты связаны с прототипами внутренним свойством [[prototype]], которое невозможно изменить и в большинстве реализаций даже получить.
А не по цепочке obj.constructor.prototype.
Многие пытаются по этой цепочки дойти до корневого объекта или даже динамически изменить прототип объекта и очень удивляются, когда не получается.
Объекты связаны с прототипами внутренним свойством [[prototype]], которое невозможно изменить и в большинстве реализаций даже получить.
А не по цепочке obj.constructor.prototype.
Многие пытаются по этой цепочки дойти до корневого объекта или даже динамически изменить прототип объекта и очень удивляются, когда не получается.
статья хорошая.
типа "я напомню :), а дальше вы и сами разберётесь"
пару ссылок на тематические статьи не помешало бы.
например
- для новичков не совсем ясно как объявлять private или public элементы класса
- как именно делать наследование.
конечно есть гугл, но всё таки.
типа "я напомню :), а дальше вы и сами разберётесь"
пару ссылок на тематические статьи не помешало бы.
например
- для новичков не совсем ясно как объявлять private или public элементы класса
- как именно делать наследование.
конечно есть гугл, но всё таки.
а как же - простите - ссылки имеются в нормальном количестве (=
ООП в JavaScript (5): Полезные ссылки
ООП в JavaScript (5): Полезные ссылки
classes are poor man's closures ©
; )
; )
Похоже на реферат статей Котерова :)
есть js-библиотеки, позволяющие описывать классы, цепочки наследования и интерфейсы. вот например одна из вариантов http://forum.agiledev.ru/index.php?t=msg&th=995
А, почему, кстати, не в блоге JavaScript?
Извините, а что тут нового относительно тех же наблов? Помоему наблы 38-40 это всё прекрасно освящают. Их не читал только самый ленивый.
К сожалению, не совсем прекрасно.
Гораздо прекрасней освящают комментарии к ним.
Гораздо прекрасней освящают комментарии к ним.
например?
Почитайте комментарии к этим статьям. Особенно, к статье о наследовании.
Почитал, на первых страницах ДК говорит о том чтобы читали внимательней наблу, а потом жуткий оффтоп...
Среди этого офтопа изредка рассыпаны крупицы знания )
Особенно в постах Zeroglif'а.
Так же далеко не здорово написана набла по замыканиям с попытками связать с Перлом.
Особенно в постах Zeroglif'а.
Так же далеко не здорово написана набла по замыканиям с попытками связать с Перлом.
Согласен, с перлом я бы связывать не стал.
Вообще Вы правы, нет ни одной статьи об ООП в JS, в которой было бы всё прекрасно.
Лично мои знания в этой области основаны на совокупности многих статей и личного опыта.
А интерес к этой тематики возбудили именно наблы.
Вообще Вы правы, нет ни одной статьи об ООП в JS, в которой было бы всё прекрасно.
Лично мои знания в этой области основаны на совокупности многих статей и личного опыта.
А интерес к этой тематики возбудили именно наблы.
Недописано.
http://disaen.com/misc/inheritance/
http://disaen.com/misc/inheritance/
Какое множественно наследование?
__proto__ только для FF и то далеко не всегда.
__proto__ только для FF и то далеко не всегда.
В общем и целом - ясная и доходчивая статья. Дописывайте, линкуйте к хабру, будем сглаживать шероховатости. ;)
истина: Details of the Object Model
developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Details_of_the_Object_Model
developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Details_of_the_Object_Model
Спасибо большое, очень полезно!
Sign up to leave a comment.
Классы, объекты и наследование в JavaScript