你应该如何设计一个带有多功能构造函数的库?

时间:2013-09-06 16:32:44

标签: javascript jquery

最近,我正在为JS编写一个小型的音乐理论库。我想添加的一个功能是用于创建/查找注释的jQuery样式选择器。例如:

Notes("a#") === Note {_note: 0, accidental: 1}

然而,图书馆的结构看起来类似于:

var Notes = function(sel) {

   // initialisation stuff
   var Note = function() {
        // stuff for note objects
   };

   var scales = {
       ...
   };

   var selector(sel) {
        // evaluate sel
        return new Note(...);
   };

   if(sel !== undefined) {
       return selector(sel);
   }

   return {
       Note: Note,
       scales: scales
   };
};
module.exports = new Notes();

这样,我可以像这样使用这个库:

var Notes = require("Notes");
Notes.scales.major.c === [0,2,4,...];

但不是这样的:

var thisNote = Notes("A#");

因为Notes显然是从原始Notes函数返回的对象。要使用选择器函数,我必须公开它,然后像这样调用它:

var thisNote = Notes.selector("A#");

但我想模仿jQuery / sizzle风格(我对jQuery的源代码进行了一些搜索,但找不到任何有帮助的东西)。

我/我应该如何接近设计以允许这种功能?使用原型而不是Closures是一种更为敏感的方法吗?或者我应该将库的名称别名化为另一种方法以实现所需的效果吗?

1 个答案:

答案 0 :(得分:1)

jQuery就像这样:

function wrap() {
    // do wrapping of DOM nodes
    return {
        value: function () { /*..*/ },
        add_class: function () { /*..*/ }
    };
}
wrap.extend = function () { /*..*/ }
wrap.ajax = function () { /*..*/ }

wrap("#abc"); // has `.value` and `.add_class)
wrap.ajax();