最近我在玩用 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 的源代码进行了一些搜索,但找不到任何有用的东西)。
我如何/应该如何接近设计以允许这种功能?使用原型而不是闭包会是一种更合理的方法吗?或者我应该将库的名称别名为另一种方法以达到预期的效果?