![]() |
Модераторы: Sardar, Aliance |
![]() ![]() ![]() |
|
cruelangel |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 12.9.2007 Репутация: 4 Всего: 8 |
я вообще не предлагал так проверять. этот код был написан для иллюстрации, что методы-таки наследуются, в то время как instanceof возвращает false;
|
|||
|
||||
fidres |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 15.11.2006 Репутация: нет Всего: 1 |
прошу прощения за оффтоп.
это во-первых. а во-вторых, я осмыслил код именно так, как я попытался его интерпритировать словами. есть переменная. с ней пытаются произвести действия. действия эти направлены на то, чтобы в конечном счёте установить ТИП переменной... или я не прав? если я что-то не правильно сказал - думаю, не лучший способ объяснять мне это нравоучением, да ещё и в общем фрэйме форума, привязываясь к словам. есть кнопочка ![]() это так - не в обиду сказано. я, конечно, ни на йоту не сомневаюсь в вашей компитенции в данном вопросе, но не стоит ставить себя выше других - это не прилично. --------------------
Исправьте ошибку в слове <ХЕРОШО> и я скажу Вам оптимист Вы или пессимист. |
|||
|
||||
vasac |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 13 Всего: 36 |
К своим друзьям, подругам и собутыльникам я обращаюсь так, как мне и им нравится. И указаний от третьих лиц по этому поводу не принимаю. Когда же я прихожу на форум, я стараюсь общаться с принятым на этом форуме этикете. И большинство остальных тоже стараются. Аргументируйте чем вы лучше остальных.
Так какого же черта вы свой поток мыслей выложили здесь? |
||||
|
|||||
Zeroglif |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Тип примитивного значения по определению не является объектным, это не объект, соответственно не чей-либо "экземпляр", нет наследования, нет свойств и т.п., "a primitive value is a datum that is represented directly at the lowest level of the language implementation". Оператор instanceof работает только с объектами, возвращая false в противном случае, так что цитирую AKS-a: "всё в соответствии со спецификацией". Необходимо различать объектный vs. не-объектный тип в javascript, а идеи типа "всё в javascript является объектом!" из головы желательно выкинуть. Наследует и станет "экземпляром" не примитивное значение, а объект "над" ним (корреспондирующий с ним), автоматически создаваемый только в те моменты, когда в соответствии с ECMAScript это потребуется, например:
Во всех этих случаях принудительно создан (на уровне логики движка это может быть реализовано как угодно) новый объект (объектный тип Оbject, объектный "подтип" или "класс" Number), который наследует свойства от Number.prototype и Object.prototype и соответственно является "экземпляром" как Number, так и Оbject (под "является экземпляром" подразумевается то, что в цепи прототипов этого объекта есть и Number.prototype, и Object.prototype). Отсюда зная, что "над" примитивным значением будет создан объект соответствующего "подтипа" совершенно не нужно конвертировать тип в объектный, достаточно только проверить сам тип примитивного значения:
Если на месте переменной n не примитивное значение, а объект, то выявлять его природу (у кого он наследует) с помощью instanceof на мой взгляд не совсем правильно с практической точки зрения, проще проверить наличие какого-нибудь нужного свойства и с ним уже работать, в любом случае дать на 100 процентов верный ответ на вопрос о "подтипе" объекта невозможно, учитывая динамику javascript и возможность переопределения всего и вся. |
||||||
|
|||||||
cruelangel |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 12.9.2007 Репутация: 4 Всего: 8 |
> Во всех этих случаях принудительно создан (на уровне логики движка это может быть реализовано как угодно) новый объект
угу, а теперь, внимание, вопрос - какого лешего instanceof не создаёт этого "надобъекта"? > с помощью instanceof на мой взгляд не совсем правильно с практической точки зрения очень даже правильно. тем самым мы проверяем обладает ли какой-либо объект необходимыми методами, либо в нём они сознательно перегружены. |
|||
|
||||
Zeroglif |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Ты так спрашиваешь, будто привык к обратному и очень удивился. Можно поставить вопрос иначе - какого лешего программисты не знают, как работают операторы языка, и ждут от них чего-то особенного? А почему сделали так, как сделали - вопрос к сделавшим. ![]()
Оператор instanceof никак не проверяет наличие методов, не выдаёт на каком уровне находится прототип, пользы от него мало, получив true от instanceof, ты можешь нарваться на метод: a) отсутствующий в природе; б) свой, не наследуемый; в) наследуемый от другого прототипа в цепочке; p.s. пост за номером 666... ещё и в адрес cruelangel... чёта волнуюсь как-то... |
||||
|
|||||
cruelangel |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 12.9.2007 Репутация: 4 Всего: 8 |
> получив true от instanceof, ты можешь нарваться на метод
всё это примеры осознанной перегрузки методов. если программист перегрузил эти методы - значит он хочет, чтобы они были перегружены. именно поэтому и применяется instanceof, а не obj1.func1==obj2.func1 > Ты так спрашиваешь, будто привык к обратному и очень удивился. я привык к логичному и последовательному поведению. instanceof проверяет наследуются ли методы от прототипа указанной функции. для примитивных типов она нагло врёт. и не надо отмазываться, что на уровне интерпретатора это не объекты. на уровне процессора вообще никаких объектов не существует - только инструкции процессору и состояние регистров. однако мы наблюдаем, что в яваскрипте примитивные типы ведут себя как объекты. а кто выглядит как собака и лает как собака, того как обычно называют? на всякий случай, объект - это данные к которым ассоциирован некоторый набор функций. вот чем примитивные типы не являются - так это ХЭШЕМ (хэш - не обязательно является объектом, а объект - хэшем). Это сообщение отредактировал(а) cruelangel - 14.10.2007, 19:26 |
|||
|
||||
Zeroglif |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
По моим пунктам а) б) в) как тебе поможет instanceof, чтобы принять смелое и безошибочное решение о вызове нужного метода?
Во-первых, "прототип указанной функции" здесь вообще не при чём, во-вторых, конкретная проверка того, "наследуются ли методы", не проводится, т.к. процедура и результат наследования (делегирования) зависит от наличия/отсутствия собственного свойства у объекта, а также от цепи прототипов. То есть, полученное true в результате работы instanceof совершенно не означает, что некое свойство будет обязательно унаследовано, с практической точки зрения эта информация малоинформативна. Может будет, а может нет.
Гы... всё ж наоборот, на уровне интерпретатора возможно всё, спорить об этом трудно, но тут речь идёт о едином для всех, но не признаваемым тобой, стандарте языка, который описал типы и обозначил поведение и алгоритмы. Можно сказать, что таким образом стандарт "отмазывается" от фантазёров и анархистов всех мастей, плодящих свои собственные виртуальные миры и смыслы... ![]()
Прям обнаблюдались, первые попавшиеся объекты:
Представь, что вышеупомянутый нолик - это действительно полноценный объект и попробуй объяснить с использованием цитат из доков-спеков, почему же тогда поведение различно. Для чего в целой куче операций в javascript проверяется наличие объекта, если кругом одни объекты? Если считать, что конвертация в другой тип, которой в javascript полно, влечёт за собой пересмотр теории и типов, то спрашивается, как и чем объяснять такое необъектное поведение нолика. ECMAScript-то это объяснить сможет, а вот вольная ассоциация про собак-кошек уже в голову как-то не лезет. ![]()
|
||||||||||
|
|||||||||||
fidres |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 159 Регистрация: 15.11.2006 Репутация: нет Всего: 1 |
и снова прошу прощение за оффтопик.
я не лучше и не хуже. но обращаться буду так, как я хочу. к тому же "чувак" - это не "ломак", согласись. мне, лично, не холодно и не жарко от того, что меня называют "чуваком". это, я лично считаю, по-приятельски и не в обиду. на что, соответственно, cruelangel и ответил, что он не в обиде. именно для того, чтоб ответить там, где была затронута суть вопроса. и вообще. я очень не люблю когда меня начинают делать флэймером. это унижает не только меня, но и тех людей, с кем подспудно я начинаю перепалку. считаю, что достойные люди должны себя достойно вести, а не начинать склоку при первом же удобном случае. если кто-то назвал вас не очень хорошим словом - первое правило хорошего тона - сделайте вид, что вы этого не заметили... что, в общем-то, и продемонстировал cruelangel. но кое-кто (не буду показывать пальцем) начал кричать, что, мол, оскорбили и унизили!.. --------------------
Исправьте ошибку в слове <ХЕРОШО> и я скажу Вам оптимист Вы или пессимист. |
|||
|
||||
vasac |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 13 Всего: 36 |
Но склоку начали именно вы. Даже не "чуваком", а своим ответом, после того, как вас поправили.
Обращаться нужно так, как хочется тому, к кому вы обращаетесь, а в случае публичной дискуссии и тем, что это читает.
А меня учили по другому — нужно сразу по лицу ![]() Почему то, в реале мало кто решается подойти к группе незнакомых людей и сказать "эй, чуваки, подвиньтесь". Господа модераторы, вырежьте нас куда-нибудь в мусорку. |
|||
|
||||
cruelangel |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 12.9.2007 Репутация: 4 Всего: 8 |
вот тут я изложил свою мысль более развёрнуто.
Это сообщение отредактировал(а) cruelangel - 1.11.2007, 09:56 |
|||
|
||||
vasac |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 13 Всего: 36 |
Да не происходит передача объектов по ссылке. Всегда по значению. Только для объектов значение — ссылка (reference type). Только в объект мы можем добавить свойства, а в примитив нет. Единственное, что мы можем сделать с переменной, содержащей примитивное значение, это заменить это самое значение. Переменной, содержащей ссылку на объект мы так же можем заменить значение. В этом единственном случае, где можно сравнивать передачу объектов и примитивов, результат будет одинаков для обоих случаев. Локальная переменная изменит значение и окончательно порвет "связь" с глобальной. Глобальная продолжит содержать, то что в ней было изначально. Вне зависимости, объект передавался или примитив. |
|||
|
||||
cruelangel |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 12.9.2007 Репутация: 4 Всего: 8 |
> Да не происходит передача объектов по ссылке. Всегда по значению.
и вообще, передача по ссылке не возможна, ибо всегда что-нибудь копируется ![]() на уровне языка обычные объекты передаются по ссылке, а примитивные - по значению. как там реализовано на уровне интерпретатора - дело десятое. |
|||
|
||||
vasac |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 13 Всего: 36 |
Все-таки объекты передаются по значению, которым является ссылка
![]() Можно это сократить до "передаются по ссылке", но всё же это понятие достаточно устоявшееся и обычно обозначает (во всяком случае большинство это понимают так) — передачу "переменной" по ссылки, а не "значения". Т.е. мы можем внутри функции заменить значение глобальной переменной. А в JS это не так. Впрочем, это уже спор о терминах. Можете привести пример, где бы раскрывался глубинный смысл различия передачи в функцию примитива или reference? А так же пример для вашей статьи, где это бы влияло при передачи примитива/объекта-над-примитивом. |
|||
|
||||
Astraller |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.8.2007 Где: $Украина[Кры м]->Феодосия Репутация: 2 Всего: 5 |
cruelangel, тут вот встал вопрос определить число ли? Искал подходящую функцию - не нашел. Решил до смешного просто:
-------------------- A.S.T.R.A.L.L.E.R.: Artificial Synthetic Technician Responsible for Assassination, Logical Learning and Efficient Repair |
|||
|
||||
![]() ![]() ![]() |
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |