我正在为我正在开发的 JavaScript 路由框架探索各种选项,并且我想提供一个用 JavaScript 编写的 DSL 来定义路由器。
我有在 String 类上使用临时原型覆盖的想法(维护先前原型值的哈希,覆盖,运行 DSL 代码,将原型值重置为原来的值),如下所示:
DSL.run(function() {
"hello".isSomething();
"foo".isSomethingElse();
});
另一个想法是使用定义临时全局变量,然后在 DSL 完成运行后删除/重置它们。这样,如果您使用window
(或任何全局对象)作为this
上下文运行 DSL 闭包,我相信您应该能够执行以下操作:
DSL.run(function() {
defineSomething("hello");
defineSomethingElse("foo");
});
我知道我知道我应该非常小心原型重载和污染全局命名空间,但这似乎是一种非常本地化且易于清理的方法,可以防止此类事情发生。我的问题是,是否有任何其他考虑因素会阻止这成为现实?
我能想到的一个潜在问题是这是否适用于 Node.js 设置,其中代码存储在单独的模块中,全局变量彼此保持,我认为这会消除选项 B,但是字符串原型重载呢?这些是在模块之间共享的,对吗?例如,如果我包含设置字符串原型值的模块 A,那么这些原型值将在包含代码中可用,对吗?
另外,让我知道是否有人以前做过这种事情。我认为这是解决这类问题的一种聪明方法,我还没有见过类似的东西,但我想确保我没有遗漏一些非常明显和该死的东西。