Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> намбер или не намбер? 
:(
    Опции темы
cruelangel
Дата 12.10.2007, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



я вообще не предлагал так проверять. этот код был написан для иллюстрации, что методы-таки наследуются, в то время как instanceof возвращает false;
PM MAIL   Вверх
fidres
Дата 14.10.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 15.11.2006

Репутация: нет
Всего: 1



прошу прощения за оффтоп.

Цитата(AKS @  12.10.2007,  10:05 Найти цитируемый пост)
Во-первых, не "чувак", а cruelangel. Именно так мы обращаемся друг к другу.
я конечно глубоко уважаю ваше отношение друг к другу, но мне бы не хотелось получать какие-то указания как и к кому мне обращаться.
это во-первых.
а во-вторых, я осмыслил код именно так, как я попытался его интерпритировать словами.
есть переменная. с ней пытаются произвести действия. действия эти направлены на то, чтобы в конечном счёте установить ТИП переменной...
или я не прав?
если я что-то не правильно сказал - думаю, не лучший способ объяснять мне это нравоучением, да ещё и в общем фрэйме форума, привязываясь к словам.
есть кнопочка user posted image, на которую стоит нажать и высказать всё своё мировозрение, не показывая другим какой Вы на самом деле умный!
это так - не в обиду сказано.
я, конечно, ни на йоту не сомневаюсь в вашей компитенции в данном вопросе, но не стоит ставить себя выше других - это не прилично.
--------------------
Исправьте ошибку в слове <ХЕРОШО> и я скажу Вам оптимист Вы или пессимист.
PM ICQ   Вверх
vasac
Дата 14.10.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Цитата(fidres @  14.10.2007,  09:37 Найти цитируемый пост)
я конечно глубоко уважаю ваше отношение друг к другу, но мне бы не хотелось получать какие-то указания как и к кому мне обращаться.

К своим друзьям, подругам и собутыльникам я обращаюсь так, как мне и им нравится. И указаний от третьих лиц по этому поводу не принимаю.
Когда же я прихожу на форум, я стараюсь общаться с принятым на этом форуме этикете. И большинство остальных тоже стараются. Аргументируйте чем вы лучше остальных.

Цитата(fidres @  14.10.2007,  09:37 Найти цитируемый пост)
есть кнопочка user posted image, на которую стоит нажать и высказать всё своё мировозрение, не показывая другим какой Вы на самом деле умный!

Так какого же черта вы свой поток мыслей выложили здесь?
PM WWW   Вверх
Zeroglif
Дата 14.10.2007, 13:22 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(cruelangel @  12.10.2007,  21:11 Найти цитируемый пост)
код был написан для иллюстрации, что методы-таки наследуются, в то время как instanceof возвращает false

Тип примитивного значения по определению не является объектным, это не объект, соответственно не чей-либо "экземпляр", нет наследования, нет свойств и т.п., "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 это потребуется, например:

Код

alert(0..toFixed); //-> function toFixed() {...

alert(0['toFixed']); //-> function toFixed() {...

with(0) {
    alert(constructor); //-> function Number() {...
}

Number.prototype.x = 'foo';
for (var i in 0) {
    alert(i); //-> 'x'
}

Во всех этих случаях принудительно создан (на уровне логики движка это может быть реализовано как угодно) новый объект (объектный тип Оbject, объектный "подтип" или "класс" Number), который наследует свойства от Number.prototype и Object.prototype и соответственно является "экземпляром" как Number, так и Оbject (под "является экземпляром" подразумевается то, что в цепи прототипов этого объекта есть и Number.prototype, и Object.prototype). Отсюда зная, что "над" примитивным значением будет создан объект соответствующего "подтипа" совершенно не нужно конвертировать тип в объектный, достаточно только проверить сам тип примитивного значения:

Код

var n = 1;
if (typeof n == 'number') {
    alert('примитивное значение типа Number, уже должно быть всё понятно');
}

Если на месте переменной n не примитивное значение, а объект, то выявлять его природу (у кого он наследует) с помощью instanceof на мой взгляд не совсем правильно с практической точки зрения, проще проверить наличие какого-нибудь нужного свойства и с ним уже работать, в любом случае дать на 100 процентов верный ответ на вопрос о "подтипе" объекта невозможно, учитывая динамику javascript и возможность переопределения всего и вся.
PM MAIL WWW   Вверх
cruelangel
Дата 14.10.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



> Во всех этих случаях принудительно создан (на уровне логики движка это может быть реализовано как угодно) новый объект 

угу, а теперь, внимание, вопрос - какого лешего instanceof не создаёт этого "надобъекта"?


> с помощью instanceof на мой взгляд не совсем правильно с практической точки зрения

очень даже правильно. тем самым мы проверяем обладает ли какой-либо объект необходимыми методами, либо в нём они сознательно перегружены. 
PM MAIL   Вверх
Zeroglif
Дата 14.10.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(cruelangel @  14.10.2007,  16:04 Найти цитируемый пост)
угу, а теперь, внимание, вопрос - какого лешего instanceof не создаёт этого "надобъекта"?

Ты так спрашиваешь, будто привык к обратному и очень удивился. Можно поставить вопрос иначе - какого лешего программисты не знают, как работают операторы языка, и ждут от них чего-то особенного?  А почему сделали так, как сделали - вопрос к сделавшим.  smile 

Цитата(cruelangel @  14.10.2007,  16:04 Найти цитируемый пост)
мы проверяем обладает ли какой-либо объект необходимыми методами, либо в нём они сознательно перегружены

Оператор instanceof никак не проверяет наличие методов, не выдаёт на каком уровне находится прототип, пользы от него мало, получив true от instanceof, ты можешь нарваться на метод:

a) отсутствующий в природе;
б) свой, не наследуемый;
в) наследуемый от другого прототипа в цепочке;

p.s. пост за номером 666... ещё и в адрес cruelangel... чёта волнуюсь как-то...
PM MAIL WWW   Вверх
cruelangel
Дата 14.10.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



> получив true от instanceof, ты можешь нарваться на метод

всё это примеры осознанной перегрузки методов. если программист перегрузил эти методы - значит он хочет, чтобы они были перегружены. именно поэтому и применяется instanceof, а не obj1.func1==obj2.func1


> Ты так спрашиваешь, будто привык к обратному и очень удивился.

я привык к логичному и последовательному поведению. instanceof проверяет наследуются ли методы от прототипа указанной функции. для примитивных типов она нагло врёт. и не надо отмазываться, что на уровне интерпретатора это не объекты. на уровне процессора вообще никаких объектов не существует - только инструкции процессору и состояние регистров. однако мы наблюдаем, что в яваскрипте примитивные типы ведут себя как объекты. а кто выглядит как собака и лает как собака, того как обычно называют?
на всякий случай, объект - это данные к которым ассоциирован некоторый набор функций.
вот чем примитивные типы не являются - так это ХЭШЕМ (хэш - не обязательно является объектом, а объект - хэшем).

Это сообщение отредактировал(а) cruelangel - 14.10.2007, 19:26
PM MAIL   Вверх
Zeroglif
Дата 14.10.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(cruelangel @  14.10.2007,  20:13 Найти цитируемый пост)
всё это примеры осознанной перегрузки методов

По моим пунктам а) б) в) как тебе поможет instanceof, чтобы принять смелое и безошибочное решение о вызове нужного метода?

Цитата(cruelangel @  14.10.2007,  20:13 Найти цитируемый пост)
instanceof проверяет наследуются ли методы от прототипа указанной функции

Во-первых, "прототип указанной функции" здесь вообще не при чём, во-вторых, конкретная проверка того, "наследуются ли методы", не проводится, т.к. процедура и результат наследования (делегирования) зависит от наличия/отсутствия собственного свойства у объекта, а также от цепи прототипов. То есть, полученное true в результате работы instanceof совершенно не означает, что некое свойство будет обязательно унаследовано, с практической точки зрения эта информация малоинформативна. Может будет, а может нет.

Цитата(cruelangel @  14.10.2007,  20:13 Найти цитируемый пост)
и не надо отмазываться, что на уровне интерпретатора это не объекты

Гы... всё ж наоборот, на уровне интерпретатора возможно всё, спорить об этом трудно, но тут речь идёт о едином для всех, но не признаваемым тобой, стандарте языка, который описал типы и обозначил поведение и алгоритмы. Можно сказать, что таким образом стандарт "отмазывается" от фантазёров и анархистов всех мастей, плодящих свои собственные виртуальные миры и смыслы...  smile 

Цитата(cruelangel @  14.10.2007,  20:13 Найти цитируемый пост)
однако мы наблюдаем, что в яваскрипте примитивные типы ведут себя как объекты

Прям обнаблюдались, первые попавшиеся объекты:

Код

alert(0 == 0); //-> true
alert(Object(0) == Object(0)); //-> false

alert(!!0); //-> false
alert(!!Object(0)); //-> true

var x = 0; x.p = 'foo'; alert(x.p); //-> undefined
var y = Object(0); y.p = 'foo'; alert(y.p); //-> 'foo'

Представь, что вышеупомянутый нолик - это действительно полноценный объект и попробуй объяснить с использованием цитат из доков-спеков, почему же тогда поведение различно. Для чего в целой куче операций в javascript проверяется наличие объекта, если кругом одни объекты? Если считать, что конвертация в другой тип, которой в javascript полно, влечёт за собой пересмотр теории и типов, то спрашивается, как и чем объяснять такое необъектное поведение нолика. ECMAScript-то это объяснить сможет, а вот вольная ассоциация про собак-кошек уже в голову как-то не лезет.  smile  Ещё, кстати, есть такие примитивные значения, как undefined и null со своими особенностями, по твоей логике они какого типа? Недообъекты? Идея про то, что "всё в javascript объекты" может и имела бы смысл в рамках ES4 или если бы она была плодотворна, если бы с её помощью объясняли особенности делегирования, конвертации примитивного значения в объект, но обычно на этом лозунге всё и заканчивается, никто не объясняет двойственность значений, как и в каких случаях происходит конвертация, каков алгоритм, хуже того, эта философия без объяснений попадает в книжки про javascript:

Цитата

"...an object can contain a set of properties, all of which are simply references to other objects (such as strings, numbers, arrays, etc.). ..."
/John Resig, "Pro JavaScript Techniques"/

PM MAIL WWW   Вверх
fidres
Дата 19.10.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 159
Регистрация: 15.11.2006

Репутация: нет
Всего: 1



и снова прошу прощение за оффтопик.

Цитата(vasac @  14.10.2007,  11:19 Найти цитируемый пост)
Аргументируйте чем вы лучше остальных.
я не лучше и не хуже. но обращаться буду так, как я хочу. к тому же "чувак" - это не "ломак", согласись.
мне, лично, не холодно и не жарко от того, что меня называют "чуваком".
это, я лично считаю, по-приятельски и не в обиду.
на что, соответственно, cruelangel и ответил, что он не в обиде.

Цитата(vasac @  14.10.2007,  11:19 Найти цитируемый пост)
Так какого же черта вы свой поток мыслей выложили здесь?
именно для того, чтоб ответить там, где была затронута суть вопроса.

и вообще. я очень не люблю когда меня начинают делать флэймером.
это унижает не только меня, но и тех людей, с кем подспудно я начинаю перепалку.
считаю, что достойные люди должны себя достойно вести, а не начинать склоку при первом же удобном случае.

если кто-то назвал вас не очень хорошим словом - первое правило хорошего тона - сделайте вид, что вы этого не заметили...
что, в общем-то, и продемонстировал cruelangel.
но кое-кто (не буду показывать пальцем) начал кричать, что, мол, оскорбили и унизили!..
--------------------
Исправьте ошибку в слове <ХЕРОШО> и я скажу Вам оптимист Вы или пессимист.
PM ICQ   Вверх
vasac
Дата 19.10.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Но склоку начали именно вы. Даже не "чуваком", а своим ответом, после того, как вас поправили.

Цитата(fidres @  19.10.2007,  12:27 Найти цитируемый пост)
я не лучше и не хуже. но обращаться буду так, как я хочу.

Обращаться нужно так, как хочется тому, к кому вы обращаетесь, а в случае публичной дискуссии и тем, что это читает.

Цитата(fidres @  19.10.2007,  12:27 Найти цитируемый пост)
первое правило хорошего тона - сделайте вид, что вы этого не заметили...

А меня учили по другому — нужно сразу по лицу smile
Почему то, в реале мало кто решается подойти к группе незнакомых людей и сказать "эй, чуваки, подвиньтесь".

Господа модераторы, вырежьте нас куда-нибудь в мусорку.
PM WWW   Вверх
cruelangel
Дата 1.11.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



вот тут я изложил свою мысль более развёрнуто.

Это сообщение отредактировал(а) cruelangel - 1.11.2007, 09:56
PM MAIL   Вверх
vasac
Дата 1.11.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Цитата

мы не можем узнать является ли объект, в контексте которого происходит вызов, самостоятельным объектом или объектом-посредником. а это бывает важно в свете того, что передача полноценных объектов происходит по ссылке, а примитивных - по значению

Да не происходит передача объектов по ссылке. Всегда по значению. Только для объектов значение — ссылка (reference type).
Только в объект мы можем добавить свойства, а в примитив нет. 

Единственное, что мы можем сделать с переменной, содержащей примитивное значение, это заменить это самое значение.
Переменной, содержащей ссылку на объект мы так же можем заменить значение.

В этом единственном случае, где можно сравнивать передачу объектов и примитивов, результат будет одинаков для обоих случаев. Локальная переменная изменит значение и окончательно порвет "связь" с глобальной. Глобальная продолжит содержать, то что в ней было изначально.
Вне зависимости, объект передавался или примитив.
PM WWW   Вверх
cruelangel
Дата 1.11.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 12.9.2007

Репутация: 4
Всего: 8



> Да не происходит передача объектов по ссылке. Всегда по значению. 

и вообще, передача по ссылке не возможна, ибо всегда что-нибудь копируется smile

на уровне языка обычные объекты передаются по ссылке, а примитивные - по значению. как там реализовано на уровне интерпретатора - дело десятое.
PM MAIL   Вверх
vasac
Дата 2.11.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Все-таки объекты передаются по значению, которым является ссылка smile

Можно это сократить до "передаются по ссылке", но всё же это понятие достаточно устоявшееся и обычно обозначает (во всяком случае большинство это понимают так) — передачу "переменной" по ссылки, а не "значения". Т.е. мы можем внутри функции заменить значение глобальной переменной. А в JS это не так.

Впрочем, это уже спор о терминах.

Можете привести пример, где бы раскрывался глубинный смысл различия передачи в функцию примитива или reference?
А так же пример для вашей статьи, где это бы влияло при передачи примитива/объекта-над-примитивом.
PM WWW   Вверх
Astraller
Дата 19.11.2007, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.8.2007
Где: $Украина[Кры м]->Феодосия

Репутация: 2
Всего: 5



cruelangel, тут вот встал вопрос определить число ли? Искал подходящую функцию - не нашел. Решил до смешного просто:
Код

if (val==parseInt(val)) ...



--------------------
A.S.T.R.A.L.L.E.R.: Artificial Synthetic Technician Responsible for Assassination, Logical Learning and Efficient Repair
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1540 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.