1

現在取り組んでいる JavaScript ルーティング フレームワークのさまざまなオプションを検討しており、ルーターを定義するために JavaScript で記述された DSL を提供したいと考えています。

String クラスで一時的なプロトタイプのオーバーライドを使用するというアイデアがありました (以前のプロトタイプ値のハッシュを維持し、オーバーライドし、DSL コードを実行し、プロトタイプ値を元の状態にリセットします)、次のようなものすべてに使用します。

DSL.run(function() {
  "hello".isSomething();
  "foo".isSomethingElse();
});

もう 1 つのアイデアは、一時的なグローバル変数の定義を使用し、DSL の実行が完了した後にそれらを削除/リセットすることでした。そうすればwindow、コンテキストとして (またはグローバル オブジェクトが何であれ) DSL クロージャーを実行すると、次のthisようなことができるはずです。

DSL.run(function() {
  defineSomething("hello");
  defineSomethingElse("foo");
});

プロトタイプのオーバーロードとグローバル名前空間の汚染に細心の注意を払う必要があることはわかっていますが、これは、そのようなことが起こらないようにするためのかなりローカライズされた、簡単にクリーンアップできるアプローチのようです。私の質問は、これが現実になるのを妨げる他の考慮事項はありますか?

私が考えることができる潜在的な問題の 1 つは、これが Node.js 設定で機能するかどうかです。この設定では、コードが個別のモジュールに保存され、グローバル変数が互いに保持されます。これにより、オプション B が排除されると思いますが、String プロトタイプのオーバーロードはどうでしょうか? それらはモジュール間で共有されていますよね?たとえば、String プロトタイプ値を設定するモジュール A をインクルードすると、それらのプロトタイプ値はインクルード コードで使用できるようになりますよね?

また、以前にこのようなことをしたことがある人がいたら教えてください。これはこの種の問題に対する巧妙なアプローチだと思いますし、そのようなものは見たことがありません。

4

1 に答える 1

1

を使用し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'"
于 2015-01-12T05:23:42.167 に答える