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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> О свойствах и методах в объектах и прототипах 
V
    Опции темы
Zeroglif
Дата 30.4.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(AKS @  30.4.2008,  11:56 Найти цитируемый пост)
Интуиция может и подвести (тогда, когда конструкторы ассоциируются с классами).

К сожалению, терминология языка очень помогает этой интуиции: 'new', 'instanceof', 'instances' - это как-то не очень подчёркивает прототипную суть.
PM MAIL WWW   Вверх
AKS
Дата 30.4.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

Репутация: 27
Всего: 52



Цитата(Zeroglif @  30.4.2008,  12:12 Найти цитируемый пост)
это как-то не очень подчёркивает прототипную суть.

Ну а что делать - что есть, то есть. 
"Папа" о своем "детище" (с явной неприязнью):
Цитата( Brendan Eich (about JavaScript))

Yet many curse it, including me. I still think of it as a quickie love-child of C and Self. Dr. Johnson's words come to mind: "the part that is good is not original, and the part that is original is not good."

Все к тому, что "слепили" наспех. Однако это не помешало тому, чтобы The World's Most Misunderstood Programming Language Has Become the World's Most Popular Programming Language. Отчасти потому, что:
Цитата(Douglas Crockford)

...JavaScript isn't too bad...

, однако, немаловажно:
Цитата(Douglas Crockford)

It is better to be lucky than smart.


PM MAIL   Вверх
ksnk
Дата 30.4.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(AKS @  30.4.2008,  11:56 Найти цитируемый пост)
Интуиция может и подвести

smile я как-то "интуитивно" упустил случай нескольких конструкторов у одного объекта...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AKS
Дата 30.4.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

Репутация: 27
Всего: 52



Цитата(ksnk @  30.4.2008,  13:02 Найти цитируемый пост)
 я как-то "интуитивно" упустил случай нескольких конструкторов у одного объекта...

Во-во, о том и я. Если считать, что функции-конструкторы — это классы в js, то так и будет "думаться интуитивно", что у объекта может быть несколько конструкторов. 
На самом же деле конструктор один. Ведь конструктор — он и в Африке конструктор. Сконструировал, и пошел (как говаривает Zeroglif) лесом. 
А instnceof обязан исследовать "генеалогию" объектов. Как это сделать, если нет классов? Обращаться к конструктору? С какой стати, если наследственные связи реализованы через прототипы (своего "папу" объект не "помнит" — (new function () {}).[[Class]] => 'Object'). Значит через них, через прототипы. Причем что-то запоминать (кто был в prototype у функции-конструктора когда-то) — это не в природе js. Отсюда и резульаты — всякий раз могут быть разные, ведь вычисляется то, что есть в данный момент...


PM MAIL   Вверх
Zeroglif
Дата 30.4.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(AKS @  30.4.2008,  12:44 Найти цитируемый пост)
с явной неприязнью

Brendan уже живёт в эру ES4, ради этого светлого будущего он готов перечислять недостатки ES3 часами, с картинками и графиками.  smile 

Цитата(AKS @  30.4.2008,  07:30 Найти цитируемый пост)
"Центральный Javascript-ресурс"

Центральный? Тогда блок рекламы. Всем без исключения нужно пройти тест "Основной Javascript" и... внимание... посчитать, сколько там неправильных правильных ответов.

Цитата(AKS @  30.4.2008,  14:10 Найти цитируемый пост)
На самом же деле конструктор один.

Если объект может быть и instanceof Одного, и instanceof Другого, а конструктор при этом всего один, то под каким термином тогда спрятаться? 
PM MAIL WWW   Вверх
AKS
Дата 30.4.2008, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

Репутация: 27
Всего: 52



Цитата(Zeroglif @  30.4.2008,  14:58 Найти цитируемый пост)
Brendan уже живёт в эру ES4...

Ха, наверно так и есть!
Цитата(Zeroglif @  30.4.2008,  14:58 Найти цитируемый пост)
Центральный?

Если что, то это не я так его "обозвал" - там титл такой: "Центральный Javascript-ресурс. Учебник с примерами скриптов. Форум. Книги и многое другое" ("многое другое" надо было в первую очередь пустить smile ).
Цитата(Zeroglif @  30.4.2008,  14:58 Найти цитируемый пост)
...под каким термином тогда спрятаться? 

Оператор как должен называться? Или что?
Если instanceof, то он ведь должен сообщить, наследует ли объект от какой-либо структуры или нет (в js к реализации подошли "творчески" - ни тем, ни другим) . Ну а по поводу конструкторов - сколько их вообще у объекта бывает-то в языках программирования?
PM MAIL   Вверх
Zeroglif
Дата 30.4.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(AKS @  30.4.2008,  15:22 Найти цитируемый пост)
Оператор как должен называться? Или что?

Не, ksnk, глядя на instanceof, интуитивно хочет сказать "несколько конструкторов у объекта", но AKS ему правильно в общем-то намекает, что "не несколько, а один" конструктор. Отсюда вопрос, как коротко терминологически описать ситуацию, чтоб без классовой терминологии, но понятно. Если не конструкторов несколько, то чего тогда? Функций (без акцента на слово конструктор)? "Классов"(в кавычках!)? Подтипов?
PM MAIL WWW   Вверх
ksnk
Дата 30.4.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(Zeroglif @  30.4.2008,  15:41 Найти цитируемый пост)
но AKS ему правильно в общем-то намекает, что "не несколько, а один" конструктор

Не догоняю я чего-то такие намеки? В том примере, который я приводил последний раз, у объекта а два конструктора obj и obj1! При срабатывании обоих конструкторов появится объект, являющийся наследником от b. Тому в ООП'е есть тьма аналогий smile

итого - что-же такое конструктор, который только один? Я-то уже как-то привык называть конструктором ту функцию, которую надо подпихнуть справа к оператору new ;-)


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AKS
Дата 30.4.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

Репутация: 27
Всего: 52



Цитата(Zeroglif @  30.4.2008,  15:41 Найти цитируемый пост)
 Если не конструкторов несколько, то чего тогда?

Из предложенных вариантов можно было бы выбрать "классов" в больших, больших таких кавычках. 
Что тут можно подразумевать под "классами" в кавычках? А как-раз их аналоги - структуры, которые обеспечивают наследование. Это - прототипы. Сколько прототипов у объекта в цепи, например:
Код

function F() {};
(new F).[[Prototype]].[[Prototype]]; // здесь сначала => {}, потом => Object.prototype

столько и будет допустимо операндов справа для instanceof, чтоб была истина. Сначала сравнивить, например:
Код

var f = new F;
f.[[Prototype]] === F.prototype; // f instanceof F

потом сравнить:
Код

f.[[Prototype]].[[Prototype]] === Object.prototype; // f instanceof Object
// или т.к. f.[[Prototype]] === F.prototype;
F.prototype.[[Prototype]] === Object.prototype;

Вот и выходит, что вроде два конструктора, а на самом деле сравниваются-то прототипы. Такой вот он, instanceof (с "изюминкой").
Или не так?

Добавлено @ 16:08
Цитата(ksnk @  30.4.2008,  15:53 Найти цитируемый пост)
 При срабатывании обоих конструкторов появится объект, являющийся наследником от b.

Так ведь при "срабатывании обоих конструкторов" появятся два объекта, и у каждого будет свой конструктор (смотря который сработал)! Только не то, чтобы "будет конструктор". Конструктор отработал - и все (дело сделано - концы в воду smile ).


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


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(AKS @  30.4.2008,  16:06 Найти цитируемый пост)
выбрать "классов" в больших, больших таких кавычках.

Угу... Проблема, видимо, в том, что ООП парадигма натягиваясь на JavaScript трещит и рвется во многих местах ;-). Некорректно рассуждать о языке используя отсутствующие в нем понятия ...

Цитата(AKS @  30.4.2008,  16:06 Найти цитируемый пост)
и у каждого будет свой конструктор
 Ага! дошло... smile



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AKS
Дата 30.4.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

Репутация: 27
Всего: 52



Цитата(ksnk @  30.4.2008,  16:16 Найти цитируемый пост)
Некорректно рассуждать о языке используя отсутствующие в нем понятия

А я никогда не хотел использовать термин "класс".

PM MAIL   Вверх
dsCode
Дата 30.4.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



ZeroglifAKS, сколько вас обоих ни читаю, всегда что-то новое и интересное узнаю. Спасибо!

Это сообщение отредактировал(а) dsCode - 30.4.2008, 16:31


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
Zeroglif
Дата 30.4.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ksnk @  30.4.2008,  15:53 Найти цитируемый пост)
итого - что-же такое конструктор, который только один? Я-то уже как-то привык называть конструктором ту функцию, которую надо подпихнуть справа к оператору new

Так и есть, справа подпихиваем один конструктор. ;)

Цитата(AKS @  30.4.2008,  16:06 Найти цитируемый пост)
Или не так?

Всё так, только вот приходится ситуацию описывать или кодом, или цитатами из ES, не хватает лаконичности, может всё-таки вместо "классов" использовать "тип объекта" или "подтип объекта", или "объектный тип бла-бла-бла". Тогда, к примеру, конструкция (a instanceof Array) в этом контексте проверяет, "может ли объект а наследовать от объекта типа Array". То есть, если типизация значений в javascript определяет один единственный тип - type Object, то типизация самих объектов базируется на связке конструктор плюc его свойство .prototype, значением которого является соответствущий мегаважный объект... Возьмём дурацкий пример:

Код

function Foo() {};
Foo.prototype = [];
var obj = new Foo();

alert(obj instanceof Foo);      //-> true
alert(obj instanceof Array);  //-> true
alert(obj instanceof Object); //-> true

Технически obj может наследовать от объектов - от Foo.prototype, от Array.prototype, от Object.prototype, а словами сразу просится сказать проще: "obj наследует от прототипа Foo", и именно так говорят очень часто, что конечно же неправильно. Термин "классы" хорош краткостью, но не про нас, а вот "тип объекта" - самое то, главное - понять на чём базируется эта типизация в среде объектов и не путать с типами значений...
PM MAIL WWW   Вверх
AKS
Дата 30.4.2008, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

Репутация: 27
Всего: 52



Цитата(Zeroglif @  30.4.2008,  19:58 Найти цитируемый пост)
... может всё-таки вместо "классов" использовать "тип объекта" или "подтип объекта", или "объектный тип бла-бла-бла".

Мне тоже так кажется, что "классы" - это "мимо нот". Ведь нет их в ES3. К тому же теперь, когда есть возможность "пощупать" JavaScript'овские классы благодаря предварительной реализации ECMAScript Edition 4, это становится совершенно очевидно.

Цитата(Zeroglif @  30.4.2008,  19:58 Найти цитируемый пост)
Тогда, к примеру, конструкция (a instanceof Array) в этом контексте проверяет, "может ли объект а наследовать от объекта типа Array".

Цитата(Zeroglif @  30.4.2008,  19:58 Найти цитируемый пост)
... "тип объекта" - самое то, главное - понять на чём базируется эта типизация в среде объектов и не путать с типами значений...

Да точно - как всегда у Вас получается предельно четко и ясно. 
Единственно, над чем задумался - как быть с пользовательскими функциями-конструкторами? Вот что я имею ввиду. С тем же самым Array все просто. А вот с функцией Foo может произойти такое (точнее с ее prototype):
Код

function Foo() {};
Foo.prototype = null;
var obj = new Foo();

Можно ли сказать, что "obj может наследовать от объекта типа Foo"? Тут ведь даже нельзя применить оператор instanceof
Кстати, Opera, в отличие от многих других, в случае c obj instanceof Foo сообщает какую-то ерунду - у Foo вдруг "пропадает" св-во [[HasInstance]]! 
Хотя это все какие-то странности, о которых и думать-то, наверно, не стоит (короче - утро вечера мудренее)...

PM MAIL   Вверх
Zeroglif
Дата 1.5.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(AKS @  30.4.2008,  21:08 Найти цитируемый пост)
Можно ли сказать, что "obj может наследовать от объекта типа Foo"?

Нельзя, в данном случае obj может наследовать от объекта типа Object (технически прямиком от Object.prototype). Таков код.

Цитата(AKS @  30.4.2008,  21:08 Найти цитируемый пост)
Тут ведь даже нельзя применить оператор instanceof

Применить можно, но с выбросом ошибки. Функция Foo создала объект, но при этом Foo.prototype не находится в цепи прототипов созданного объекта, и, соответственно, этот объект не может наследовать от объекта типа Foo.
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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