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

Поиск:

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


Новичок



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

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



Доброго время суток.
Читал статьи что-то понял что-то нет.
Например есть такое:
Код

function A(){}
A.prototype.method = function(){...}
//or
function A(){}
A.prototype = {method:function(){}}
//or
function A(){
this.method = function(){...}
}

Вопрос такой в каких случаях стоит юзать тот или иной способ ?
И какой из способов создания объекта самый оптимальный и почему ?

Например такой вариант:
Код

function A(){
this.method = method;

Почему-то встречается редко, хотя мне кажется более оптимальны для быстродействия так как в объекте хранятся не методы а ссылки.
Хотя вполне могу ошибается !

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


Эксперт
***


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

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



SunOK, если на основании одного конструктора будет создаваться несколько объектов, то несомненно лучше хранить их общие методы в прототипе, а не создавать для каждого объекта свой набор.
PM WWW   Вверх
Zeroglif
Дата 18.9.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

//1
function A(){}
A.prototype.method = function(){...}

Объект-прототип является "родным", то есть создан автоматически в момент создания конструктора. Метод будет унаследован всеми экземплярами A. Вполне себе чисто и красиво.

Код

//2
function A(){}
A.prototype = {method:function(){}}

Объект-прототип переопределяется (создаётся заново), ссылка на "родной" умирает, забирая вместе с собой свойство constructor. В итоге, мы  лишний раз создаём объект, плюс до кучи теряем определённое свойство, вернуть которое можно будет только руками. Метод будет унаследован всеми экземплярами A, но созданными после переопределения объекта-прототипа, если экземпляр создан до, то объект-прототип другой (тот самый "родной" или переопределённый ещё ранее).

Код

//3
function A(){
this.method = function(){...}
}

Объект-прототип вообще не задействуется, метод пишется непосредственно в поле экземпляра. Если предположить, что метод для всех экземпляров должен быть один и тот же, то этот вариант не оптимален, т.к. при каждом вызове конструктора заново создаётся функция со всеми сопутствующими ей прибамбасами.

Код

//4
function A(){
this.method = method;
}

Объект-прототип тоже не задействуется, метод пишется непосредственно в поле экземпляра, но функция каждый раз не создаётся, вместо этого мы имеем более оптимальную и банальную операцию присваивания. Надо учитывать, что функция-метод в этом случае болтается в глобальном контексте, забрав под себя имя, с другой стороны, эта функция будет доступна скрипту as is. Вполне приемлимый вариант, особенно если с объектом-прототипом будут играть как-то в плане наследования, и нет желания полагаться на его поля. 

!!!Это в самых общих чертах, конкретика зависит от задачи.
PM MAIL WWW   Вверх
SunOK
Дата 18.9.2006, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Zeroglif :
Цитата

Надо учитывать, что функция-метод в этом случае болтается в глобальном контексте, 

А что в этом плохого  ?
Цитата

 эта функция будет доступна скрипту as is.

Что это значит, в смысле что такое "скрипт as is" ?

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


Опытный
**


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

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



Цитата(SunOK @  18.9.2006,  14:20 Найти цитируемый пост)
А что в этом плохого  ?

Да в общем-то ничего страшного в этом нет. Просто если сравнивать с вариантом N 1, где анонимная функция стала методом, в последнем варианте приходится контролировать идентификатор/имя функции (чтоб не конфликтовал ни в глобальном, ни в локальном контексте...). Это если процедурно всё сделано...

 
Цитата(SunOK @  18.9.2006,  14:20 Найти цитируемый пост)
Что это значит, в смысле что такое "скрипт as is" ?

Функция создана независимо, к ней есть простой обычный доступ по имени, можно с первой же строки скрипта использовать её в качестве метода для экземпляров другого конструктора или вообще как самостоятельную процедуру. "as is" == "как есть"

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


Новичок



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

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



Спасибо всё понял  smile !  
Вот ещё вопрос: в либе prototype.js есть такая штука как Try.this() может немного подругому, ну вы поняли, принимает масив методов и с помощью try-catch пробует их реализовать, не слишком ли это растачительно, может легче обьявит пару глобальных  isIE, isNN и юзать их в этом же Try.this() ?

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


Эксперт
***


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

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



Sun_ok, ага, isIE, isIE5, isNN, isOpera8, isOpera9, isFF, isEnableActiveX...
PM WWW   Вверх
SunOK
Дата 19.9.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да ладно, в большистве случаев катит:  isIE? ... : (isNN? ... : ... ) .
Я очень извеняюсь что пишу это тут, просто  незнаю куда такой вопрос можно втулить.
так вот:
Код

Function.prototype.bind = function(object){
    var self = this
    return function() {
    return self.apply(object, arguments);
    }
}
Window.prototype.startDrag = function()
{
    document.onmousemove = this.drag.bind(this);
    ....
}
Window.prototype.drag = function(e){...}

Зачем это нужно, тоесть  ф-ция bind() ??
пока это последний вопрос smile !
PM MAIL WWW   Вверх
Sun_ok
Дата 19.9.2006, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile   хоть дайте линк где искать ответ на предыдущий вопрос !! 
Или, я спрашиваю вообще  что-то несуразнаое ?!
PM MAIL WWW   Вверх
Sardar
Дата 19.9.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(SunOK @  19.9.2006,  10:26 Найти цитируемый пост)
Зачем это нужно, тоесть  ф-ция bind() ??

В смысле "зачем это нужно"? bind() оборачивает вызов "метода обьекта" в анонимную функцию, которую можно положить обработчиком события. В чём конкретно проблема?


M
Sardar
Из-за размытого названия теме и вообще из-за довольно редких (но не плохо разжёванных и давно с ответами) вопросов оставляю тему, но в предь новые вопросы кидай по новым темам.


Далее философия.

bind() и подобные утилиты были бы не нужны подойти парни из ECMA с головой к вопросу что есть "свободная функция", а что вызываемая на контексте/обьекте. Полезно всё таки было бы ввести привязку к контексту автоматом:

Код
function test() {}
test.prototype.method = function() { alert(this.toString()); }

var a = new test();
var b = a.method; //автоматом связывает method с обьектом в так, что
b(); //вызывает a.method(), а
b.apply(another_object); //вызывает как обычно (another_object).method()

Но увы к языку, используемому очень серьёзно, стандарт для веба, подошли так "лишь бы отвязались", а мы потом десяток лет паримся...

Философия окончена.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
AKS
Дата 20.9.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Sardar, можно маленькое замечание? 
Код

var b = a.method; //автоматом связывает method с обьектом в так, что
b(); //вызывает a.method()

Здесь не связывается "method с обьектом", и b() не "вызывает a.method()". В переменной, в итоге этих действий, оказывается та самая анонимная функция, которая изначально была назначена test.prototype.method. 



PM MAIL   Вверх
Sardar
Дата 20.9.2006, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



AKS, повторяю, всё что было в "Философия" есть просто размышления на тему как должно быть, но не сделано парнями из ECMA.

Цитата(Sardar @  19.9.2006,  22:57 Найти цитируемый пост)
bind() и подобные утилиты были бы не нужны подойти парни из ECMA с головой к вопросу что есть "свободная функция", а что вызываемая на контексте/обьекте. Полезно всё таки было бы ввести привязку к контексту автоматом:


Иногда тянет меня на философию smile


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


 




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


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

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