![]() |
Модераторы: Sardar, Aliance |
![]() ![]() ![]() |
|
Се ля ви |
|
||||||||||||||||||||||||||
![]() Java/SOAрхитектор ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2016 Регистрация: 5.6.2004 Где: place without tim e and space Репутация: 5 Всего: 127 |
Насколько я понял, наследование в JS реализуется за счёт того, что объект содержит в себе неявную ссылку на объект-предок в иерархии наследования (эта ссылка является явной для FF и называется "__proto__").
Но есть один нюанс: для объекта, расположенного по этой ссылке, должно выполняться требование, что его свойство "constructor" ссылается на функцию-конструктор объекта, а сам объект в случае необходимости получает ссылку на свой конструктор, как раз через эту самую неявную ссылку (в случае FF - явную - "__proto__"), вызывая свойство "constructor". Когда ScriptEngine не находит свойства "constructor" в объекте, она обращается к "__proto__" и пытается найти это свойство у объекта, расположенного по этому адресу. Таким образом, если мы смотрим на это хозяйство из объекта, то для FF справедливо следующее:
, так как на самом деле, поскольку
, происходит следующее:
Для остальных же браузеров, получается, что из объекта мы можем увидеть прототип только воспользовавшись правой частью первого тождества. Если эта цепочка из двух (а с неявным - трёх) вызовов нарушится, то объект не сможет явно увидеть свой прототип. Таким образом, когда мы производим наследование присвоением
, то после этого получается вот что:
, зато:
, поскольку
и
, так что фактически мы имеем следующее тождество:
, т.е. мы потеряли связь с конструктором объекта "childObj"! Авторы нескольких статей про JS-наследование специально указывают на этот момент и призывают после присвоения ссылке "prototype" объекта-предка присвоить ссылку на её "constructor":
Да, таким образом мы восстановили ссылку на конструктор объекта "childObj", но проблему мы эту решили, создав себе другую - теперь для всех браузеров, кроме FF, мы потеряли ссылку на конструктор объекта "parentObj"! Ведь теперь:
, так что
И только в FF мы можем написать
, а в остальных браузерах - кирдык. Думается, что использование длинных деревьев наследования обязательно спотыкнётся об это обстоятельство или по крайней мере создаст большие неудобства. Вот, собственно, и проблема - как это ограничение модели можно было бы на ваш взгляд обойти? -------------------- |
||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 49 Всего: 401 |
Если не ошибаюсь, именно эту путаницу некогда разруливал Zeroglif в своем "культовом" комменте к котеровской набле о наследовании в JS...
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
Се ля ви |
|
|||
![]() Java/SOAрхитектор ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2016 Регистрация: 5.6.2004 Где: place without tim e and space Репутация: 5 Всего: 127 |
SelenIT, да, Zeroglif там это объяснил, но лекарства не дал - пост заканчивается констатацией этого факта и вопрос, что с этим делать не поднял. Может быть, там будет про это дальше - сейчас почитаю тему, всё-таки пять листов после этого...
-------------------- |
|||
|
||||
AKS |
|
|||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Се ля ви, я дочитал вот до этого (дальше пока не стал читать - с утра голову надо беречь ;) ):
Вы ведь чуть выше написали: Вы явно немного запутались. А начать "распутывать" можно с этого: childObj.constructor.prototype = parentObj. Вот зачем это? |
|||
|
||||
Се ля ви |
|
|||
![]() Java/SOAрхитектор ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2016 Регистрация: 5.6.2004 Где: place without tim e and space Репутация: 5 Всего: 127 |
Так, забудьте, что я тут до этого написал. Давайте начнём заново?
Я решил описать проблему в комментариях к коду. Комментариев получилось очень много, за то можно теперь весь этот текст загнать в редактор и, запустив в браузере (будет работать только в FF) понять, что всё работает именно так, как я расписываю. Так же весьма рекомендую периодически по ходу чтения поглядывать в схемку, за которую большой "Thanks" Zeroglif`у.
Пока расписывал, нащупал решение проблемы и сейчас его тестирую. Как решу - напишу сюда. В любом случае получилось на мой взгляд весьма познавательное чтиво для тех, кто не очень хорошо разобрался в тонкостях реализации наследования в ECMAScript. -------------------- |
|||
|
||||
Се ля ви |
|
|||
![]() Java/SOAрхитектор ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2016 Регистрация: 5.6.2004 Где: place without tim e and space Репутация: 5 Всего: 127 |
Завершил и проблема решилась. В ближайшее время переработаю это в нормальную статью.
Вот полный вариант, изабильно снабжённый комментариями (фактически, это и есть статья из комментариев со вставками кода):
-------------------- |
|||
|
||||
AKS |
|
|||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Это все ради того, чтобы получить возможность написать что-то, вроде:
? Или есть еще мотивы? |
|||
|
||||
Се ля ви |
|
|||
![]() Java/SOAрхитектор ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2016 Регистрация: 5.6.2004 Где: place without tim e and space Репутация: 5 Всего: 127 |
AKS, я писал:
Просто не знаю - элементарно дискомфортно иметь объект, но не иметь при этом ссылки на его конструктор. Как-то так... ![]() -------------------- |
|||
|
||||
AKS |
|
||||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Ключевая фраза: "использование длинных деревьев... создаст большие неудобства". И это совершенно верно! На самом деле, мне просто жаль (честное слово ;) ) вашего времени, сил и энергии, которые могут быть напрасно истрачены. А ведь можно изменить подход и начать думать по-js’овски. Вот, специально для этого случая нашел кое-какие высказывания js-гуру (как раз есть кое-что по-поводу "длинных деревьев наследования" и прочей class-based мишуры):
Я подчеркнул на мой взгляд наиболее значимые моменты (если будут трудности с переводом. то могу помочь ;) ). Надеюсь, что эти высказывания опытных программистов как-нибудь когда-нибудь пригодятся... Happy scripting (как пишут англоязычные программисты)! ![]() |
||||
|
|||||
Се ля ви |
|
|||
![]() Java/SOAрхитектор ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2016 Регистрация: 5.6.2004 Где: place without tim e and space Репутация: 5 Всего: 127 |
AKS, большое спасибо, что нашли эти высказывания!
Это уже превращается в философскую дискуссию. Что бы было понятно по аналогии, приведу свою заметку в ЖЖ двухлетней давности:
Или другие мои рассуждения, касающиеся вопроса о свободе: Дождевой кольчатый червяк не имеет скелета и может изгибаться как ему заблагорассудится, как не может изгибаться ни один гимнаст. Более того, он обладает настолько простой структурой тела, что легко восстанавливается, если его разорвать - и будет два червяка. Но человек за счёт скелета и сложности строения организма, имеет прямохождение, которое если и может добиться червяк, встав на свои кончики, то оно дастся ему страшно большой потерей энергии и фактически недостижимо. Т.е. свобода в одном означает отсутсвие свободы в другом. В общем, все достоинства - они же и обратные стороны недостатков и тут нужен баланс в зависимости от того, чего хочется добиться. В Java, которой я занимаюсь, тоже есть феноменальная гибкость, но там эти методы вынесены в отдельный пакет java.reflection которым не принято пользоваться без необходимости - что бы не наводить бардака в программе. С её помощью тоже можно добавлять, удалять и заменять методы объектов, создавать классы на лету и делать всё что угодно, нарушая каноны class-based программирования, но это используют обычно только при написании сред разработки, в остальных приложениях использование Reflection API считается дурным тоном и используется по минимуму. И мощность и масштаб Java-приложений в итоге зашкаливает. А с другой стороны, не использование Reflection API подавляющим большинством программистов позволяет делать прекрасные средства разработки типа IntelliJ IDEA, которые очень сильно помогают при разработки больших приложений. Я представляю, насколько тяжело было людям разрабатывать тот же GMail, если они, как вы выражаетесь, мыслили по-js`овски. Мне хочется найти способ проще создавать большие приложения и для этого необходим иной компромисс жёсткости и гибкости для этого языка - и мне кажется, что пример в этом как раз и можно брать с Java. Вот я и пытаюсь выработать рекомендации по программированию на JS для того, что бы реализовать такой компромисс и сделать возможным создание хитрых web-интерфейсов и удобных средств для их разработки. ![]() -------------------- |
|||
|
||||
![]() ![]() ![]() |
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |