Конструктор обёртки 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, время: 12:32. |