![]() |
Модераторы: Sardar, Aliance |
![]() ![]() ![]() |
|
Burrr |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 4.9.2005 Репутация: 10 Всего: 20 |
Приветствую!
Речь пойдет о статье ООП в Java Script (2): Классы, размещенной на karaboz.ru. Процитирую комментарий, оставленный пользователем Zeroglif:
Вопрос: "О какой цепочке речь?". Может кто-нибудь четко объяснить механизм поиска при обращении к свойству объекта? Добавлено @ 22:04 Для пояснения приведу пример:
Как возможно, что второй вызов метода срабатывает? Точнее где теперь хранится метод, если в контексте объекта он не создавался, а прототип пуст? Это сообщение отредактировал(а) Burrr - 29.4.2008, 22:06 |
||||
|
|||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Объект несколько сложнее, чем можно выразить средствами JavaScript
![]() Своими словами - прототип объекта при создании нового элемента копируется в скрытое поле самого объекта. Это поле, imho, доступно нам только в ощущениях, напрямую заюзать его нельзя... Свойство prototype объекта (не функции) никакого дополнительного смысла не несет, да и вообще никакого смысла не несет кроме заданного пользователем ![]() -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
Burrr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 4.9.2005 Репутация: 10 Всего: 20 |
ksnk
1) У объектов нет прототипа, прототипы есть только у конструкторов. 2) Если бы при создании каждого экземпляра объекта прототип конструктора записывался бы в скрытое поле объекта, то это немеряно жрало бы память, чего не наблюдается, да и смысла не было бы в такой реализации прототипирования. Добавлено @ 23:21 ksnk, правильней будет сказать "Экземпляры объекта наследуют свойства и методы от прототипа конструктора, но не имеют собственного прототипа". Это сообщение отредактировал(а) Burrr - 29.4.2008, 23:23 |
|||
|
||||
ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Что такое конструктор? по моему это - функция, к которой применяется оператор new... imho, я про это и говорил ;-) Вообще-то я подразумевал ссылку на "объект". Скопировать один указатель на объект это тоже расточительство? Весь prototype-based механизм наследования на этом и строится... Можно сочинить тест, "унаследовав" объект A от обьекта B, а затем добавив свойство в объект В. Чудесным образом это-же свойство появляется и у А... Добавлено через 2 минуты и 3 секунды В свете предложенного эксперимента такая фраза вызывает недоумение и желание уточнить, что-же такое прототип ![]() Добавлено через 7 минут и 17 секунд
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
||||
|
|||||
Burrr |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 4.9.2005 Репутация: 10 Всего: 20 |
ksnk, нужно определиться с терминологией, иначе комментарии будут вводить в заблуждение. В JavaScript всё является объектами, но для ясности некоторые объекты следует называть иначе.
И так:
правильно звучит так: "Прототип конструктора при создании экземпляра объекта копируется в скрытое поле этого конструктора". В таком свете всё становится ясно и нареканий не вызывает ![]() Только откуда взято такое утверждение? Есть чем подтвердить или это догадка?
Нет это не расточительство. Но где хранится эта предполагаемая ссылка? В экземпляре объекта или в конструкторе?
Прототип - это свойство конструктора, хранящее ссылку на объект, содержащий хеш со свойствами и методами, например, со свойством constructor, указывающего обратно на функцию конструктор.
Вы не очень понимаете что такое наследование и ваш пример - это создание 2-х экземпляров объекта одного класса, которые достают свое свойство из прототипа конструктора, в котором в своб очередь стоит ссылка на глобальный oбъект b = {} и не более того. Добавлено @ 00:09 Сразу поясню насчет наследования: Наследование - это понятие из ООП, подразумевающее возможность порождать один класс от другого с сохранением свойств-методов класса родителя, возможностью их переопределения и добавленич новых свойств-методов. За неимением классов, реализация наследования через прототип в JavaScript от одного конструктора другому - не такая уж простая задача. Это сообщение отредактировал(а) Burrr - 30.4.2008, 00:17 |
||||||||
|
|||||||||
Burrr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 4.9.2005 Репутация: 10 Всего: 20 |
Ага, а вот и ответ на мой первоначальный вопрос:
http://www.javascript.ru/tutorial/object/i...type-i-prototip |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Хмм... Для моего примера - obj - конструктор, b - прототип, a - объект. Согласно отквоченному утверждению, после строки a= new obj(); в obj будет содержаться скрытая ссылка на b. Что будет если заменить obj.prototype и сделать генерацию нового объекта? Или конструктор - более сложная субстанция? imho, каждый объект содержит по крайней мере два скрытых списка - список конструкторов, с которым работает инструкция instanceof и список прототипов (поле __proto__ для FF ), по которому производится поиск свойств этого объекта. Формируются эти списки в момент выполнения new. Ну и конечно, для хранения всего этого списка в каждый новый объект достаточно добавить пару ссылок... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
AKS |
|
||||||||||||||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Я, конечно, понимаю, что найти что-то стоящее не так-то просто. Слово javascript в строке поиска вернет что-нибудь, типа "Центральный Javascript-ресурс" (кто его сделал центральным?), а слово prototype так вообще вернет результат не для слабонервных. Тем не менее, можно, проявив смекалку, набрать какую-нибудь хитрую комбинацию слов, одним из которых задать известное имя. Тогда может попасться ссылка на форум dklab, а там уже прямая дорога к шпаргалке всех времен и народов — http://forum.dklab.ru/viewtopic.php?p=102575#102575. Читать же то, что написано на "центральных ресурсах", где авторы по наитию описывают все своими словами, пытаясь наобум попасть пальцем в небо, довольно утомительное занятие. Ведь надо еще догадаться, что имеется ввиду, когда используется ненормативная лексика (в рамках ECMAScript Language Specification) или собственные фантазии вместо фактов. Например:
Указывает, от кого наследовать, значит? Что и от кого будет наследовано вот здесь:
? Или как уразуметь вот это:
"Ставите", "говорите"? Бо-о-о-же мой! А вот еще:
Далее картинка, изображающая:
И в заключении:
Вот как догадаться после таких объяснений, кто и где там "стоит" или "находится"? Добавлено @ 07:38
Зачем объекту содержать список конструкторов, если instanceof конструкторами "не интересуется" (они могут быть полезны лишь в качестве операнда)? Это сообщение отредактировал(а) AKS - 30.4.2008, 07:39 |
||||||||||||||
|
|||||||||||||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
? Каким, интересно образом вот такая конструкция может сработать a=new Array(); alert(a instanceof Array);, есль объект a не будет содержать ссылку на функцию Array? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
AKS |
|
||||||||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Этот instanceof мог бы выглядеть примерно так (абстрактно):
, или в FF вот так:
Так что объекту a не надобности в "ссылках" на функцию Array. Именно этот принцип позволяет вот такому выражению быть истиной:
|
||||||||
|
|||||||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Таки да... Видимо, так оно и сделано... Правда выглядит это как-то стремно...
Это сообщение отредактировал(а) ksnk - 30.4.2008, 10:05 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
AKS |
|
|||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
||||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Я интуитивно расчитываю, что конструкция a instanceof obj будет выдавать true всегда, а конструкция a instanceof obj1 будет выдавать всегда false...
![]() ![]() -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
Zeroglif |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Все беды, братцы, от переизбытка в javascript самого слова "prototype":
- object's prototype; - prototype-based inheritance; - each constructor has a prototype property - every constructor has an associated prototype; - constructor has an implicit reference to the prototype; - implicit prototype chain; - prototype is an object; - ... Если сюда ещё добавить и общий смысл - prototype (образец, прототип) и вспомнить заодно про одноимённую библиотеку, с помошью которой про прототип гуглить уже бесполезно, то картинка удручает... ![]() |
|||
|
||||
AKS |
|
||||
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
С этим, вроде бы, жить можно (потихоньку, не высовываясь ![]()
Интуиция может и подвести (тогда, когда конструкторы ассоциируются с классами). |
||||
|
|||||
![]() ![]() ![]() |
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |