Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 22.07.2008, 22:16
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Виталий,

- схожие по семантике методы и общие свойства надо выносить в прототип, иначе у тебя каждый новый объект будет иметь свои методы и свойства (ну вот зачем каждому объекту иметь один и тот же массив - this.week = ['Sunday','Monday','Tuesday','Wednesday','Thursday' ,'Friday','Saturday' ] ;? - ему место в прототипе. (Это не единственный случай)).

- если хочешь сделать shortcut для метода с длинным названием - сошлись на него, а не плоди новую анонимную функцию:

// сжираешь лишние ресурсы
Date.prototype.gDt = function() {
	return this.getDate() ;
}

// а так - нормально
Date.prototype.gDt = Date.prototype.getDate;


- Бенчмарки для работы с таблицами устраивались не раз (вот один из них - http://www.quirksmode.org/dom/innerhtml.html); DOM-методы далеко не самые быстрые.
__________________
Тонкости ECMAScript
Ответить с цитированием
  #12 (permalink)  
Старый 23.07.2008, 01:09
Аспирант
Отправить личное сообщение для Виталий Посмотреть профиль Найти все сообщения от Виталий
 
Регистрация: 20.07.2008
Сообщений: 30

this.week - ему место в прототипе.
хочу понять, правильно я понимаю, для каждого нового объекта будет создана новая переменная week, с выделенной памятью, а если чере prototype.week то будет ссылка на это массив в Base классе ?
но я не понимаю откуда она возьмется, если Base класс не создается ,?
Ответить с цитированием
  #13 (permalink)  
Старый 23.07.2008, 11:02
Аватар для Snipe
Профессор
Отправить личное сообщение для Snipe Посмотреть профиль Найти все сообщения от Snipe
 
Регистрация: 06.05.2008
Сообщений: 765

Мое предложение - шаблоны:
<html>
<head>
<script type="text/javascript" src="calend.js"></script>
</head>
<body>
<div id="test_div"></div>
<script type="text/javascript">
	drawT(new Date(2008, 06, 21));
</script>
</body>
</html>

var STR = '<table cellspacing="0" cellpadding="0" border="1" onselectstart="return false;" class="HWCalendar" id="Calendar"><thead><tr><td colspan="8"></td></tr></thead><tbody><tr class="head"><td> </td><td>#mon#</td><td>#tue#</td><td>#wen#</td><td>#thu#</td><td>#fri#</td><td>#sat#</td><td>#sun#</td></tr><tr><td class="day-time">12:00 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">12:30 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">01:00 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">01:30 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">02:00 AM</td><td/><td class="click"/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">02:30 AM</td><td/><td/><td class="click"/><td/><td/><td/><td/></tr><tr><td class="day-time">03:00 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">03:30 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">04:00 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">04:30 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">05:00 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">05:30 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">06:00 AM</td><td class="click"/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">06:30 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">07:00 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">07:30 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">08:00 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">08:30 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">09:00 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">09:30 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">10:00 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">10:30 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">11:00 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">11:30 AM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">12:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">12:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">01:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">01:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">02:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">02:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">03:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">03:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">04:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">04:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">05:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">05:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">06:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">06:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">07:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">07:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">08:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">08:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">09:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">09:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">10:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">10:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">11:00 PM</td><td/><td/><td/><td/><td/><td/><td/></tr><tr><td class="day-time">11:30 PM</td><td/><td/><td/><td/><td/><td/><td/></tr></tbody></table>';
var DAY = 1000*60*60*24;
/* #mon#, #tue#, #wen#, #thu#, #fri#, #sat#, #sun#*/
function getD(_date) {
	_date.setTime(Date.parse(_date) + DAY);
	return _date;
}
function drawT(mondayDate) {
	var startT = new Date();
	document.getElementById('test_div').innerHTML = STR.replace('#mon#', mondayDate).replace('#tue#', getD(mondayDate)).replace('#wen#', getD(mondayDate)).replace('#thu#', getD(mondayDate)).replace('#fri#', getD(mondayDate)).replace('#sat#', getD(mondayDate)).replace('#sun#', getD(mondayDate));
	alert(new Date() - startT);
}


Набросал совсем коротко, строго не судите - времени нет %)

Собственно наглый довольно метод, но зато очень простой и наглядный (люблю простоту). По времени не сравнивал, но мне кажется должно быть быстро.

Кстати, мне тоже интересны мнения.

Последний раз редактировалось Snipe, 23.07.2008 в 11:10.
Ответить с цитированием
  #14 (permalink)  
Старый 23.07.2008, 13:26
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Виталий
для каждого нового объекта будет создана новая переменная week, с выделенной памятью, а если чере prototype.week то будет ссылка на это массив
да, только функцияКонструктор.prototype.wee k = ['bla', 'bla'];

Сообщение от Виталий
если Base класс не создается
если не создается, то и ссылки нет (я вижу, что вы apply'ете WCalendar_Base к HWCalendar_Sheduling - HWCalendar_Base.call( this ), но этот call создаст лишь свойства для объектов HWCalendar_Sheduling, в то время как HWCalendar_Sheduling.prototype.week = [] или WCalendar_Base.prototype.week = [] (в случае, если б HWCalendar_Sheduling наследовался от WCalendar_Base) держали бы общий массив week на всех)
__________________
Тонкости ECMAScript
Ответить с цитированием
  #15 (permalink)  
Старый 23.07.2008, 13:48
Аспирант
Отправить личное сообщение для Виталий Посмотреть профиль Найти все сообщения от Виталий
 
Регистрация: 20.07.2008
Сообщений: 30

Сообщение от Snipe Посмотреть сообщение
Мое предложение - шаблоны:
var STR = '<table cellspacing="0" cellpadding="0" border="1" onselectstart="return false;" class="HWCalendar" ...
Вопрос как раз и заключался - чтобы создать таблицу динамически, иначе прикола никакого нету просто мне может понадобиться ее сделать на год или на 2 или 3 месяца.
Ответить с цитированием
  #16 (permalink)  
Старый 23.07.2008, 13:52
Аспирант
Отправить личное сообщение для Виталий Посмотреть профиль Найти все сообщения от Виталий
 
Регистрация: 20.07.2008
Сообщений: 30

А можно пример функцияКонструктор.prototype = week при множественном наследовании, чтобы все объекты ссылались на один week ?

// а так - нормально
Date.prototype.gDt = Date.prototype.getDate;

при создании календаря на 1 год быстрее примерно от 3-7мс!
+1

Последний раз редактировалось Андрей Параничев, 23.07.2008 в 14:45.
Ответить с цитированием
  #17 (permalink)  
Старый 23.07.2008, 16:54
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Виталий
при множественном наследовании
Что за множественное наследование? В JS одно наследование - prototype-based. Или ты имеешь в виду call'ы и apply'и чтобы создать объекту свои this-свойства на основе функций-контейнеров? Если последнее - то не получится, т.к. нет возможности по цепи прототипов достучаться до нужного свойства.

P.S.: В сущности, твой подход можно абстрактно-философски (подчеркиваю, т.к. этого нет в JS - для тех, кто любит цепляться к словам) сравнить с примесями (mixin) - ты подмешиваешь в объект свойства из других функций-конструкторов.

А в общем, все просто (без подробностей: "восстановление свойства constructor", "проблема холостых выстрелов" и т.д.):

function A() {};
A.prototype.week = [];

function B() {};
B.prototype = new A();

var b = new B();
// week будет найдено по цепи
// прототипов в прототипе А
alert(b.week);
__________________
Тонкости ECMAScript
Ответить с цитированием
  #18 (permalink)  
Старый 23.07.2008, 23:11
Аспирант
Отправить личное сообщение для Виталий Посмотреть профиль Найти все сообщения от Виталий
 
Регистрация: 20.07.2008
Сообщений: 30

Ладно, все это конечно то, но особого прироста не дает, есть еще идеи ? методы ?
Ответить с цитированием
  #19 (permalink)  
Старый 24.07.2008, 00:21
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Сообщение от Виталий
но особого прироста не дает
Мысли системно, а не конкретным "календарем". Если создать 1000 объектов, где у каждого будет один и тот же массив - сколько израсходуется памяти? А если положить его в прототип - сколько? Я всего лишь информировал - дело твое =)
__________________
Тонкости ECMAScript
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация и разбор javascript! o55rus Общие вопросы Javascript 2 23.09.2008 20:33
Оптимизация скриптов object Ваши сайты и скрипты 9 21.07.2008 13:58
Выполнить код после загрузки изображения EugenyK Events/DOM/Window 2 15.07.2008 10:09
как разодрать код scuter Общие вопросы Javascript 1 25.04.2008 21:39
Стоит ли пользоваться библиотеками или лучше писать свой код? lancer Общие вопросы Javascript 5 24.03.2008 19:31