33

元の関数を呼び出す新しいバージョンで Javascript 組み込み関数をオーバーライドしたいと考えています (super多くの言語で呼び出すバージョンでクラスのメソッドをオーバーライドするのと同様です)。これどうやってするの?

例えば...

window.alert = function(str) {
    //do something additional
    if(console) console.log(str);

    //super.alert(str) // How do I do this bit?
}
4

5 に答える 5

56

元の関数への参照を変数に格納します。

(function() {
    var _alert = window.alert;                   // <-- Reference
    window.alert = function(str) {
        // do something additional
        if(console) console.log(str);
        //return _alert.apply(this, arguments);  // <-- The universal method
        _alert(str);                             // Suits for this case
    };
})();

普遍的な方法は<original_func_reference>.apply(this, arguments)-コンテキストを保持し、すべての引数を渡すことです。通常、元のメソッドの戻り値も返されます。

ただし、これalertはvoid関数であり、引数を1つだけ取り、オブジェクトを使用しないことがわかっていthisます。したがって、_alert(str)この場合は十分です。

注:IE <= 8を上書きしようとするとエラーがスローされるため、の代わりにをalert使用していることを確認してください。window.alert = ...alert = ...

于 2012-05-03T08:30:32.800 に答える
23

「スーパー」はありません。とにかく、元の関数オブジェクトを「維持」するためのクロージャを作成します。

window.alert新しい関数オブジェクト(プロパティに割り当てられている)を返す「自己呼び出し関数」に注意してください。返された新しい関数オブジェクトは、「自己呼び出し関数」に渡された元のに評価される変数の周りにクロージャを作成します。 originalwindow.alert

window.alert = (function (original) {
  return function (str) {
    //do something additional
    if(console) {
      console.log(str)
    }
    original(str)
  }
})(window.alert)

ただし、一部のブラウザでは、他のビルトインの変更が妨げられる可能性があると思います...alert

ハッピーコーディング。

于 2012-05-03T08:31:54.720 に答える
7

あなたの質問は、ビルトインをどのように上書きし、それでも呼び出すことができるかということだと思います。まず、免責事項として、デバッグ/テストが不可能になるため、正当な理由がない限り、組み込みを上書きしないでください。

これはあなたがそれをする方法です:

window._alert = window.alert;
window.alert = function(str) { 
     if(console) console.log(str);
     window._alert(str);
}
于 2012-05-03T08:31:43.563 に答える
2

Javascript で単純な古典的な継承を行う方法:

SuperClass.call(this) // inherit from SuperClass (multiple inheritance yes)

関数をオーバーライドする方法:

this.myFunction = this.myFunction.override(
                    function(){
                      this.superFunction(); // call the overridden function
                    }
                  );

オーバーライド関数は次のように作成されます。

Function.prototype.override = function(func)
{
 var superFunction = this;
 return function() 
 {
  this.superFunction = superFunction;
  return func.apply(this,arguments);
 };
};

複数の引数で動作します。
未定義または非関数をオーバーライドしようとすると失敗します。
「superFunction」を「予約済み」単語にします:-)

于 2012-10-01T11:04:06.480 に答える
1

JavaScriptは古典的な継承モデルを使用しません。同様の構文を使用できるようにクラスを作成する方法を説明する素晴らしい記事がここにありますが、ネイティブではサポートされていません。

于 2012-05-03T08:32:33.117 に答える