[Вероятно] Самое элегантное решение
Во-первых, jQuery использует шаблон, который ближе к Монаде , Factory или их комбинации.,Тем не менее, вот что я использовал в своих проектах, потому что сам шаблон так слабо связан с любым классом, который вы хотели бы использовать:
;(function (undefined) {
if (undefined) return;
var ENV = this;
var Class = function Class() {
var thus = this;
function find(data) {
console.log('@find #data', data);
return this;
}
function show(data) {
console.log('@show #data', data);
return this;
}
// export precepts
this.find = find;
this.show = show;
return this;
};
var Namespace = ENV['N'] = new (function Namespace(Class) {
var thus = this;
var Ns = Class.apply(function Ns(data) {
if (this instanceof N) {
return new Namespace(Class);
}
return Ns.find.apply(Ns, arguments);
});
return Ns;
})(Class);
}).call(window || new function Scope() {});
var n = N('#id').show(450);
var m = new N();
m('#id')('.curried').show('slow');
console.log(n !== m); // >> true
По сути, вы можете использовать его как функциюобъекта и используйте ключевое слово new
для создания другого уникального объекта / функции.Вы можете использовать это для принудительного применения метода арбитр (по умолчанию, как метод find
выше) или использовать другие методы в зависимости от того, какие параметры вводятся.Например, вы можете сделать что-то вроде:
var elementsList = N('#id1')('#id2')('#otherSpecialElement').each(fn);
- ИЛИ -
var general = N('.things');
var specific = general('.specific')('[data-more-specific]').show();
Выше, например, будет накапливаться список узлов из нескольких элементов (1-е выражение),или развернуть до одного конкретного элемента (2-й).
Надеюсь, это поможет