2

JavaScriptで関数ラッパー(例:athrottleまたはdebouncefunction)を作成するとき、「装飾された」関数を検査し、基礎となる関数が何であるかを知ることができるようにしたいと思います。throttle例として、の実装を取り上げます。

function throttle(fn, time) {
  var handle;

  var execute = function() {
    handle = null;
    fn.apply(this, arguments);
  };

  var throttled = function() {
    if(!handle) {
      handle = setTimeout(execute.bind(this), time);
    }
  };

  throttled.toString = function() {
    return fn.toString() + "\n// throttled to " + time + "ms";
  };

  return throttled;
}

var makeAjax = throttle(function(callback) {
  $.getJSON("/path", callback);
}, 500);

console.log(makeAjax);

console.log呼び出しは次のように表示されます。

function (callback) {
  $.getJSON("/path", callback);
}
// throttled to 500ms

私のユーザーとして、throttle私はその内部よりも私がそれを与えた機能にずっと気を配っていthrottledます。

ただし、ネイティブ関数をオーバーライドするときは、いつも少し不安を感じます。これを行うときに心配すべきコンプライアンスやパフォーマンスの問題はありますか?

4

1 に答える 1

3

Mozilla Developer Group では、toString() のオーバーライドについて詳しく説明しています。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/toString

ここで考えられる問題は、自動化された単体テストを作成することです (私の経験は NUnit Selenium に限られています)。プライベート .toString() を使用できないか、テスト結果が不安定になる可能性がありますか? デバッグも問題になる可能性があります。

メソッドを持つ他のローカル js 関数をオーバーライドするには、すべてのメソッドを手動で拡張して、オーバーライドされたものを置き換える必要がある場合があります。

Addy Osmani は、彼の著書「Learning JavaScript Design Patterns」( http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript ) でこれについて詳しく説明しています。

于 2013-01-11T17:11:43.337 に答える