4

Rubyでは、欠落しているメソッドの呼び出しをキャプチャして、その場で定義できます。

JavaScriptで達成したいのは、メソッドのないオブジェクトを作成することです。欠落しているメソッドをemit()の呼び出しに変換したい:

app.isReady() -> app.emit("isReady")
soldier.kills() -> soldier.emit("kills")

実行時に(固定リストから)すべてのメソッドを定義するよりも、欠落しているメソッドエラーをキャプチャしてemit(methodName)を実行する方が良いと思います。そうすれば、オブジェクトに数百または数千のイベントがある場合でも、パフォーマンスのオーバーヘッドが発生しません。

これを行うための最良の方法は何ですか?

更新:これはAPI設計であるため、次のことは避けてください。

try {
  app.isReady()
} catch(e) {
  ...
}

ユーザーが通常どおりメソッドを使用できるように、これを舞台裏でどのように実行できるかを知りたいです。

4

4 に答える 4

6

このようにして、オブジェクトに数百/数千のイベントがある場合でも、パフォーマンスのオーバーヘッドは発生しません。

オブジェクトにメソッドを追加することによるパフォーマンスのオーバーヘッドが、メソッド呼び出しをエミット呼び出しに変換することによるパフォーマンスのオーバーヘッドよりも小さいと考えるのは、大きな誤解だと思います。

ただし、この機能をES5に実装することはできません

ただし、 Harmonyプロキシを使用してこれを実装することもできます。

シミュレーション__noSuchMethod__を検討することをお勧めします。

ES6プロキシは実験的なものであり、V8でオンにできるため、今日node.jsで使用できると思います。

于 2011-11-27T03:53:27.450 に答える
2

アプリがMozillaでのみ実行されることを保証できない限り、この段階でこれを一貫して行うことはできません。その場合、noSuchMethodが必要です。

私の知る限り、他のどのブラウザもこれをまだ実装していません。

于 2011-11-27T03:52:27.683 に答える
0

test次のプロセスを使用して、関数ポインターでRegExpを使用します。

  • オブジェクトリテラルを引数として渡す
  • デフォルトのメソッドの名前を文字列として渡します
  • フォールバックメソッドの名前を文字列として渡します
  • 添え字表記を使用して関数ポインタを逆参照する
  • 正規表現を使用して、タイプを名前と照合しますfunction
  • 成功した場合は、添え字表記を使用してデフォルトを呼び出します
  • 失敗した場合は、添え字表記を使用してフォールバックを呼び出します

例えば:

/* Define mapping */
var app = {"emit": emit};

/* Define interface */
function emit(){}

function \u1000missing(object, method, fallback)
  {
  /* Existence check */
  if (/function/.test(object[method]) ) 
    {
    object[method]();
    }
  /* reify */
  else
    {
    object[fallback](method)
    }    
  }

\u1000missing(app,"isReady","emit")

なぜ下付き文字表記を使用したいのかと疑問に思うかもしれません。添え字表記により、プロパティとメソッドを動的に作成できます。したがって、何らかのメタプログラミングを行う場合は、下付き文字表記を使用している可能性があります。

参考文献

于 2014-04-04T19:31:00.500 に答える
0

私はあなたの状況に対処するためにNode.jsパッケージを作成しました。これは自動オブジェクトと呼ばれます。

ここに一瞥があります:

const myObject = autoObject.createObject(function(name) {
    if(name.startsWith("say")) {
        return function() {
            return name.substr(3);
        }
    }

    return name;
});

myObject.foo;       ///< "foo" 
myObject.sayFoo();  ///< "Foo" 
myObject.sayBar();  ///< "Bar" 

さらに、これはクラスでも機能します。

于 2017-06-17T12:57:19.953 に答える