簡體   English   中英

臨時全局變量/函數和原型重寫以編寫JS DSL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM