![]() |
Модераторы: Sardar, Aliance |
![]() ![]() ![]() |
|
Zeroglif |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
||||
|
||||
AKS |
|
||||||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Ну а что делать - что есть, то есть. "Папа" о своем "детище" (с явной неприязнью):
Все к тому, что "слепили" наспех. Однако это не помешало тому, чтобы The World's Most Misunderstood Programming Language Has Become the World's Most Popular Programming Language. Отчасти потому, что:
, однако, немаловажно:
|
||||||
|
|||||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
![]() -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
AKS |
|
|||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Во-во, о том и я. Если считать, что функции-конструкторы — это классы в js, то так и будет "думаться интуитивно", что у объекта может быть несколько конструкторов. На самом же деле конструктор один. Ведь конструктор — он и в Африке конструктор. Сконструировал, и пошел (как говаривает Zeroglif) лесом. А instnceof обязан исследовать "генеалогию" объектов. Как это сделать, если нет классов? Обращаться к конструктору? С какой стати, если наследственные связи реализованы через прототипы (своего "папу" объект не "помнит" — (new function () {}).[[Class]] => 'Object'). Значит через них, через прототипы. Причем что-то запоминать (кто был в prototype у функции-конструктора когда-то) — это не в природе js. Отсюда и резульаты — всякий раз могут быть разные, ведь вычисляется то, что есть в данный момент... |
|||
|
||||
Zeroglif |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Brendan уже живёт в эру ES4, ради этого светлого будущего он готов перечислять недостатки ES3 часами, с картинками и графиками. ![]() Центральный? Тогда блок рекламы. Всем без исключения нужно пройти тест "Основной Javascript" и... внимание... посчитать, сколько там неправильных правильных ответов. Если объект может быть и instanceof Одного, и instanceof Другого, а конструктор при этом всего один, то под каким термином тогда спрятаться? |
|||
|
||||
AKS |
|
|||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Ха, наверно так и есть! Если что, то это не я так его "обозвал" - там титл такой: "Центральный Javascript-ресурс. Учебник с примерами скриптов. Форум. Книги и многое другое" ("многое другое" надо было в первую очередь пустить ![]() Оператор как должен называться? Или что? Если instanceof, то он ведь должен сообщить, наследует ли объект от какой-либо структуры или нет (в js к реализации подошли "творчески" - ни тем, ни другим) . Ну а по поводу конструкторов - сколько их вообще у объекта бывает-то в языках программирования? |
|||
|
||||
Zeroglif |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Не, ksnk, глядя на instanceof, интуитивно хочет сказать "несколько конструкторов у объекта", но AKS ему правильно в общем-то намекает, что "не несколько, а один" конструктор. Отсюда вопрос, как коротко терминологически описать ситуацию, чтоб без классовой терминологии, но понятно. Если не конструкторов несколько, то чего тогда? Функций (без акцента на слово конструктор)? "Классов"(в кавычках!)? Подтипов? |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Не догоняю я чего-то такие намеки? В том примере, который я приводил последний раз, у объекта а два конструктора obj и obj1! При срабатывании обоих конструкторов появится объект, являющийся наследником от b. Тому в ООП'е есть тьма аналогий ![]() итого - что-же такое конструктор, который только один? Я-то уже как-то привык называть конструктором ту функцию, которую надо подпихнуть справа к оператору new ;-) -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
AKS |
|
||||||||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Из предложенных вариантов можно было бы выбрать "классов" в больших, больших таких кавычках. Что тут можно подразумевать под "классами" в кавычках? А как-раз их аналоги - структуры, которые обеспечивают наследование. Это - прототипы. Сколько прототипов у объекта в цепи, например:
столько и будет допустимо операндов справа для instanceof, чтоб была истина. Сначала сравнивить, например:
потом сравнить:
Вот и выходит, что вроде два конструктора, а на самом деле сравниваются-то прототипы. Такой вот он, instanceof (с "изюминкой"). Или не так? Добавлено @ 16:08
Так ведь при "срабатывании обоих конструкторов" появятся два объекта, и у каждого будет свой конструктор (смотря который сработал)! Только не то, чтобы "будет конструктор". Конструктор отработал - и все (дело сделано - концы в воду ![]() Это сообщение отредактировал(а) AKS - 30.4.2008, 16:10 |
||||||||
|
|||||||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Угу... Проблема, видимо, в том, что ООП парадигма натягиваясь на JavaScript трещит и рвется во многих местах ;-). Некорректно рассуждать о языке используя отсутствующие в нем понятия ... Ага! дошло... ![]() -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
AKS |
|
|||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
||||
|
||||
dsCode |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 565 Регистрация: 8.9.2007 Где: Saint-Petersburg Репутация: 19 Всего: 26 |
Zeroglif, AKS, сколько вас обоих ни читаю, всегда что-то новое и интересное узнаю. Спасибо!
Это сообщение отредактировал(а) dsCode - 30.4.2008, 16:31 |
|||
|
||||
Zeroglif |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Так и есть, справа подпихиваем один конструктор. ;) Всё так, только вот приходится ситуацию описывать или кодом, или цитатами из ES, не хватает лаконичности, может всё-таки вместо "классов" использовать "тип объекта" или "подтип объекта", или "объектный тип бла-бла-бла". Тогда, к примеру, конструкция (a instanceof Array) в этом контексте проверяет, "может ли объект а наследовать от объекта типа Array". То есть, если типизация значений в javascript определяет один единственный тип - type Object, то типизация самих объектов базируется на связке конструктор плюc его свойство .prototype, значением которого является соответствущий мегаважный объект... Возьмём дурацкий пример:
Технически obj может наследовать от объектов - от Foo.prototype, от Array.prototype, от Object.prototype, а словами сразу просится сказать проще: "obj наследует от прототипа Foo", и именно так говорят очень часто, что конечно же неправильно. Термин "классы" хорош краткостью, но не про нас, а вот "тип объекта" - самое то, главное - понять на чём базируется эта типизация в среде объектов и не путать с типами значений... |
||||
|
|||||
AKS |
|
||||||||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Мне тоже так кажется, что "классы" - это "мимо нот". Ведь нет их в ES3. К тому же теперь, когда есть возможность "пощупать" JavaScript'овские классы благодаря предварительной реализации ECMAScript Edition 4, это становится совершенно очевидно.
Да точно - как всегда у Вас получается предельно четко и ясно. Единственно, над чем задумался - как быть с пользовательскими функциями-конструкторами? Вот что я имею ввиду. С тем же самым Array все просто. А вот с функцией Foo может произойти такое (точнее с ее prototype):
Можно ли сказать, что "obj может наследовать от объекта типа Foo"? Тут ведь даже нельзя применить оператор instanceof. Кстати, Opera, в отличие от многих других, в случае c obj instanceof Foo сообщает какую-то ерунду - у Foo вдруг "пропадает" св-во [[HasInstance]]! Хотя это все какие-то странности, о которых и думать-то, наверно, не стоит (короче - утро вечера мудренее)... |
||||||||
|
|||||||||
Zeroglif |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Нельзя, в данном случае obj может наследовать от объекта типа Object (технически прямиком от Object.prototype). Таков код. Применить можно, но с выбросом ошибки. Функция Foo создала объект, но при этом Foo.prototype не находится в цепи прототипов созданного объекта, и, соответственно, этот объект не может наследовать от объекта типа Foo. |
|||
|
||||
![]() ![]() ![]() |
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |