![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| SunOK |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 5.10.2005 Репутация: нет Всего: 1 |
Доброго время суток.
Читал статьи что-то понял что-то нет. Например есть такое:
Вопрос такой в каких случаях стоит юзать тот или иной способ ? И какой из способов создания объекта самый оптимальный и почему ? Например такой вариант:
Почему-то встречается редко, хотя мне кажется более оптимальны для быстродействия так как в объекте хранятся не методы а ссылки. Хотя вполне могу ошибается ! |
||||
|
|||||
| vasac |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 13 Всего: 36 |
SunOK, если на основании одного конструктора будет создаваться несколько объектов, то несомненно лучше хранить их общие методы в прототипе, а не создавать для каждого объекта свой набор.
|
|||
|
||||
| Zeroglif |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Объект-прототип является "родным", то есть создан автоматически в момент создания конструктора. Метод будет унаследован всеми экземплярами A. Вполне себе чисто и красиво.
Объект-прототип переопределяется (создаётся заново), ссылка на "родной" умирает, забирая вместе с собой свойство constructor. В итоге, мы лишний раз создаём объект, плюс до кучи теряем определённое свойство, вернуть которое можно будет только руками. Метод будет унаследован всеми экземплярами A, но созданными после переопределения объекта-прототипа, если экземпляр создан до, то объект-прототип другой (тот самый "родной" или переопределённый ещё ранее).
Объект-прототип вообще не задействуется, метод пишется непосредственно в поле экземпляра. Если предположить, что метод для всех экземпляров должен быть один и тот же, то этот вариант не оптимален, т.к. при каждом вызове конструктора заново создаётся функция со всеми сопутствующими ей прибамбасами.
Объект-прототип тоже не задействуется, метод пишется непосредственно в поле экземпляра, но функция каждый раз не создаётся, вместо этого мы имеем более оптимальную и банальную операцию присваивания. Надо учитывать, что функция-метод в этом случае болтается в глобальном контексте, забрав под себя имя, с другой стороны, эта функция будет доступна скрипту as is. Вполне приемлимый вариант, особенно если с объектом-прототипом будут играть как-то в плане наследования, и нет желания полагаться на его поля. !!!Это в самых общих чертах, конкретика зависит от задачи. |
||||||||
|
|||||||||
| SunOK |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 5.10.2005 Репутация: нет Всего: 1 |
Zeroglif :
А что в этом плохого ?
Что это значит, в смысле что такое "скрипт as is" ? |
||||
|
|||||
| Zeroglif |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 644 Регистрация: 22.9.2005 Репутация: 28 Всего: 66 |
Да в общем-то ничего страшного в этом нет. Просто если сравнивать с вариантом N 1, где анонимная функция стала методом, в последнем варианте приходится контролировать идентификатор/имя функции (чтоб не конфликтовал ни в глобальном, ни в локальном контексте...). Это если процедурно всё сделано... Функция создана независимо, к ней есть простой обычный доступ по имени, можно с первой же строки скрипта использовать её в качестве метода для экземпляров другого конструктора или вообще как самостоятельную процедуру. "as is" == "как есть" |
|||
|
||||
| Sun_ok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.9.2006 Репутация: нет Всего: нет |
Спасибо всё понял
Вот ещё вопрос: в либе prototype.js есть такая штука как Try.this() может немного подругому, ну вы поняли, принимает масив методов и с помощью try-catch пробует их реализовать, не слишком ли это растачительно, может легче обьявит пару глобальных isIE, isNN и юзать их в этом же Try.this() ? |
|||
|
||||
| vasac |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 13 Всего: 36 |
Sun_ok, ага, isIE, isIE5, isNN, isOpera8, isOpera9, isFF, isEnableActiveX...
|
|||
|
||||
| SunOK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 5.10.2005 Репутация: нет Всего: 1 |
Да ладно, в большистве случаев катит: isIE? ... : (isNN? ... : ... ) .
Я очень извеняюсь что пишу это тут, просто незнаю куда такой вопрос можно втулить. так вот:
Зачем это нужно, тоесть ф-ция bind() ?? пока это последний вопрос |
|||
|
||||
| Sun_ok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 4.9.2006 Репутация: нет Всего: нет |
Или, я спрашиваю вообще что-то несуразнаое ?! |
|||
|
||||
| Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
В смысле "зачем это нужно"? bind() оборачивает вызов "метода обьекта" в анонимную функцию, которую можно положить обработчиком события. В чём конкретно проблема?
Далее философия. bind() и подобные утилиты были бы не нужны подойти парни из ECMA с головой к вопросу что есть "свободная функция", а что вызываемая на контексте/обьекте. Полезно всё таки было бы ввести привязку к контексту автоматом:
Но увы к языку, используемому очень серьёзно, стандарт для веба, подошли так "лишь бы отвязались", а мы потом десяток лет паримся... Философия окончена. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
| AKS |
|
|||
|
Участник форума ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 20.9.2006 Репутация: 27 Всего: 52 |
Sardar, можно маленькое замечание?
Здесь не связывается "method с обьектом", и b() не "вызывает a.method()". В переменной, в итоге этих действий, оказывается та самая анонимная функция, которая изначально была назначена test.prototype.method. |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
AKS, повторяю, всё что было в "Философия" есть просто размышления на тему как должно быть, но не сделано парнями из ECMA.
Иногда тянет меня на философию -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |