Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Создание копий объекта - обязателен ли prototype? (https://javascript.ru/forum/misc/9399-sozdanie-kopijj-obekta-obyazatelen-li-prototype.html)

heh131 14.05.2010 14:11

Создание копий объекта - обязателен ли prototype?
 
Добрый день!

Задача - создать объект SPAN и использовать его в разных местах страницы.

Код для создания объекта:
function newSpan(){
	var o=document.createElement("span");
	// установка атрибутов
	o.onclick=function(){Expand(аргументы)}
	return o
}


Создание копий:
obj=new newSpan();


Код работает, но есть опасение, что он не совсем верный, что надо использовать prototype. Подскажите, пожалуйста, верно ли я сомневаюсь или можно спокойно и дальше использовать подобную конструкцию?

А также вопрос, а не лучше ли для этого использовать метод .cloneNode(false)?

Спасибо большое за ответы и помощь! :write:

Kolyaj 14.05.2010 14:28

Вам даже new не нужен, какой там prototype. Обычная функция, создающая элемент.

heh131 14.05.2010 16:49

Kolyaj, спасибо большое за ответ!
А можете чуть поподробнее - в целом я правильно делаю или можно/нужно лучше? Ибо меня именно беспокоит вопрос наиболее качественной реализации этой задачи.
п.с. Спан-ов будет много и у каждого свой onclick event.

Riim 14.05.2010 17:29

Понимать можно так:
document.createElement('div') == new Element('div')
т. е. вы уже создаете экземпляр, и оборачивать его в еще один конструктор смысла нет, достаточно обернуть в функцию.

Riim 14.05.2010 17:36

Вариант 1:
var newSpan = function() {
  var el=document.createElement("span");
  el.onclick=arguments.callee.onclick;
  return el;
};

newSpan.onclick = function() {Expand(аргументы)};


Вариант 2:
var newSpan = (function() {

var onclick = function() {Expand(аргументы)};

return function() {
  var el=document.createElement("span");
  el.onclick=onclick;
  return el;
};

})();


Вариант 2 мне больше нравится, я почти всегда начинаю со следующей конструкции:
var MyObj = (function() {

return {
  initialize: function() {
    //
  }
};

})();

heh131 14.05.2010 18:46

Riim, спасибо огромное!
Попробую второй вариант.

А не подскажите "чайнику", почему во втором варианте есть открывающая скобка перед словом (function, а также все заканчивается конструкцией )(); Закрывающая скобка еще более менее понятна, чтобы закрыть пару, но в целом - зачем они и зачем еще и в конце пара пустых скобок?

Riim 14.05.2010 19:15

http://javascript.ru/forum/misc/4071...jj-vopros.html

heh131 14.05.2010 19:39

Riim, спасибо! :thanks:
Теперь точно сделаю по второму варианту, ибо он стал полностью понятен!
п.с. Кстати, сравнитель текста - классная штука! Буквально на днях нужен был для сравнения конфигураций. Буду теперь использовать Ваш! :)

heh131 14.05.2010 20:12

Riim,
я проверил, работают обе версии кода. Но первый вариант, он как бы компактнее (и понятнее лично для меня). Чем второй вариант лучше? У этих вариантов вообще есть принципиальные различия или это лишь разный стиль написания, а итог будет один? Есть ли различия для браузеров, влияет ли это на скорость выполнения кода, а также на размер используемой памяти?

Riim 14.05.2010 21:32

Цитата:

Сообщение от heh131
Чем второй вариант лучше?

мне удобней, кому как нравится.

Цитата:

Сообщение от heh131
влияет ли это на скорость выполнения кода

вариант 2 теоретически чуть быстрей.

Цитата:

Сообщение от heh131
а также на размер используемой памяти

вариант 1 теоретически использует меньше памяти.


Часовой пояс GMT +3, время: 12:50.