Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Хорошо ли так делать? (https://javascript.ru/forum/misc/1820-khorosho-li-tak-delat.html)

Octane 21.09.2008 21:43

Хорошо ли так делать?
 
Возникли сомнения по поводу реализации такого кода:
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:

Dmitry A. Soshnikov 22.09.2008 14:58

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

P.S.: а вот расширять прототип Object'a как раз-таки не рекомендуют. Тем самым ты обрекаешь людей в циклах for (var k in) делать постоянную проверку на .hasOwnProperty(...).

Octane 22.09.2008 21:44

Цитата:

Сообщение от Dmitry A. Soshnikov
а условный комментарий - он проверяется постоянно при входе в блок кода?

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

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

Цитата:

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

так метод «each» и призван иправить эту ситуацию :) Конечно если бы он был единственным в проекте, это было бы не рациональное решение.


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