![](/img/trans.png)
[英]How to use the prototype functions in predefined global variables in Javascript?
[英]temporary global variables/functions and prototype overrides to write a JS DSL
我正在研究我正在使用的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,但是String原型重載怎么辦? 這些在模塊之間共享,對嗎? 例如,如果我包含設置字符串原型值的模塊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'"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.