Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.09.2008, 21:43
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Хорошо ли так делать?
Возникли сомнения по поводу реализации такого кода:
var core = {
	ie: 0 /*@cc_on + @_jscript_version * 10 % 10 @*/
};

Object.prototype.each = function(fn, arg) {
  for(var key in this) if(this.hasOwnProperty(key)) fn.apply(this[key], arg || []);
  return this;
};

if(!Array.prototype.forEach) Array.prototype.forEach = function(fn, context) {
  var i, length = this.length;
  for(i = 0; i < length; i++) fn.call(context, this[i], i, this);
};

function makeArray(list) {
  var array = [];
  if(!core.ie) array = Array.prototype.slice.call(list);
  else Array.prototype.forEach.call(list, function(el) {
    array.push(el);
  });
  return array;
}

function getElements(tag, node) {
  return /*@cc_on makeArray( @*/ (node || document).getElementsByTagName(tag) /*@cc_on ) @*/;
}

Проблема собственно в том, что описынный метод «each» доступен в нормальных браузерах и для «DOMNodeList», но для IE, чтобы использовать «each» нужно список преобразовать, например, в массив, для этого подходит одна из имеющихся в проекте функций «makeArray». Чтобы не выполнять «makeArray» в нормальных браузерах, заключил его в условные комментарии, только не уверен хорошо ли так делать? :confused:

Последний раз редактировалось Octane, 21.09.2008 в 21:47.
Ответить с цитированием
  #2 (permalink)  
Старый 22.09.2008, 14:58
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

Octane, а условный комментарий - он проверяется постоянно при входе в блок кода? Я просто их не практикую (а зря, наверно - многие проверки можно сделать намного короче). Для не-IE-браузеров в данном случае потери в скорости не будет никакой (т.к. это комментарий), а для IE (если /*@cc_on ... @*/ проверяется каждый раз) - лишняя проверка при каждом вызове метода getElements(...).

P.S.: а вот расширять прототип Object'a как раз-таки не рекомендуют. Тем самым ты обрекаешь людей в циклах for (var k in) делать постоянную проверку на .hasOwnProperty(...).
__________________
Тонкости ECMAScript
Ответить с цитированием
  #3 (permalink)  
Старый 22.09.2008, 21:44
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от Dmitry A. Soshnikov
а условный комментарий - он проверяется постоянно при входе в блок кода?
Не знаю написал вот, а потом задумался. С другой стороны, функция статическая, можеть быть она один раз анализируется...

Кстати, «packer» от Dean Edwards не справляется с таким выкрутасом, но обычное использование условных комментариев поддерживает.

Сообщение от Dmitry A. Soshnikov
Тем самым ты обрекаешь людей в циклах for (var k in) делать постоянную проверку на .hasOwnProperty(...)
так метод «each» и призван иправить эту ситуацию Конечно если бы он был единственным в проекте, это было бы не рациональное решение.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что не так? giGnet Общие вопросы Javascript 8 23.06.2008 22:51