Конструктор обёртки DOM-элементов и возвращаемые значения
Допустим есть такой конструктор обёртки, который ищет элемент по идентификатору:
function $(…) {
if (this.constructor != $) {
return new $(…);
}
…
this.node = …;
…
return …;
}
Используем: var obj = $(…); Вот как будет лучше, чтобы вел себя этот конструктор:
obj → {node: Element} или null
или
obj → {node: Element или null}
? В первом случае удобнее выполнять проверки:
if ($("#id")) { … }
Но если написать так:
var obj = new $("id");
то не логично в результате получать null, в случае, когда элемент не найден? |
Цитата:
|
Просто в результате выражения с оператором new, ожидается получить объект, а тут вдруг еще и null появляется. Хотя мне этот вариант больше нравится, да и typeof null по счастливой случайности везде выдает "object", но будет ли он удобен для других программистов? Может еще есть какие-то достоинства и недостатки у вариантов:
$(…) → {node: Element} или null
$(…) → {node: Element или null}
Это еще для того, чтобы не было мертвых цепочек, как в jQuery:
$("#id-которого-нет-на-странице").method1(…).method2(…).method3(…) // нет ошибок
|
Цитата:
Этот "сахар" с new часто используют в обёртках для классов, типа:
var MyClass = new Class({...});
где new - что есть, что нет - так, для красоты и интуитивно-ожидаемого результата. С другой стороны, "мёртвые цепочки" в jQuery, выглядят ещё менее интуитивно. Действительно, если объект не найден - его нет, и обёртка - ни к чему. Хотя, это только моё мнение. |
Значит всем нравится вариант:
$(…) → {node: Element} или null
new $(…) → {node: Element} или null
Хорошо :) так и сделаю. Еще вопрос, как лучше этот Element в документации записывать/называть и вообще эту обёртку {node: Element} записывать? Cейчас на объявление переменной node типа Element больше похоже, как в Delphi :) |
Octane,
а тебя не смущает, что для использования кастомных методов нужно будет писать el.method(), а для нативных -- el.node.method()? |
А как по другому цепочки строить? Если ты имеешь ввиду этот пример, то там тоже не все хорошо, в IE экземпляр $(Element) и this→Element будут иметь разный набор методов. А еще повсеместный apply снизит производительность.
|
Цитата:
|
Цитата:
Ну а если серьезно, то мне кажется удобным применение/построение цепочек, несмотря на этот недостаток. Такие вещи:
$(document.body).append("div").text("…");
делают код более читабельным :) |
Цитата:
|
| Часовой пояс GMT +3, время: 02:52. |