我正在探索我正在处理的JavaScript路由框架的各种选项,我想提供用JavaScript编写的DSL来定义路由器。
我的想法是在字符串类上使用临时原型覆盖(维护先前原型值的哈希,覆盖,运行DSL代码,将原型值重置为它们的原型):<<<<<</p>
DSL.run(function() {
"hello".isSomething();
"foo".isSomethingElse();
});
另一个想法是使用定义临时全局变量,然后在运行DSL后删除/重置它们。这样,如果您以window
(或全局对象)作为this
上下文运行DSL关闭,我相信您应该能够做以下操作:
DSL.run(function() {
defineSomething("hello");
defineSomethingElse("foo");
});
我知道我知道我知道我应该对原型过载和污染全局名称空间非常谨慎,但这似乎是一种非常局部且易于清理的方法,以防止这种事情发生。我的问题是,还有其他考虑可以阻止这一现实吗?
我能想到的一个潜在问题是,这是否可以在node.js设置中起作用,其中代码存储在单独的模块和彼此之间保存的全局变量中,我认为这将消除选项B,但是字符串原型的内容超载?这些是在模块之间共享的,对吗?例如如果我包含模块A(设置字符串原型值),那么这些原型值将在包含代码中可用,对吗?
另外,让我知道之前是否有人做过这种事情。我认为这是解决此类问题的一种聪明的方法,我还没有看到任何类似的问题,但是我想确保我不会遗漏一些非常明显和可恶的东西。
使用delete String.prototype[method]
。
var dsl = function(f){
var _ = String.prototype;
_.isSomething = function(){
console.log('isSomething: '+this);
}
_.isSomethingElse = function(){
console.log('isSomethingElse: '+this);
}
f();
delete _.isSomething;
delete _.isSomethingElse;
}
dsl(function(){
"hello".isSomething(); // isSomething: hello
"foo".isSomethingElse(); // isSomethingElse: foo
});
// "hello".isSomething(); // error "Object has no method 'isSomething'"
// "foo".isSomethingElse(); // error "Object has no method 'isSomethingElse'"