どのようにjavascriptでメソッドを拡張するには?

メソッドに追加の機能を追加したいと思います。例えば:

console.log()

元の 'ログ'機能はそのまま残っていますし、新しいことをすることもできます。これは可能ですか?私はプロトタイプを使用していくつかのビットを読んだことがありますが、それを把握していません。

どうもありがとう、

3
fcombine では、関数を組み合わせて新しい関数を返すことができます。
追加された 著者 Raynos,
あなたはOBJECTに何かを追加することはできますが、既に存在するものは変更することはできません。コンソールオブジェクトにlog2()を追加できますが、既存のlog()は変更できません。
追加された 著者 friendzis,

5 答え

それは非常に簡単です。新しい log メソッドを古い log メソッドの代わりにしたい場合は、次のようにします:

console._log = console.log;//just backing up old log method
console.log = function(){
    console._log(arguments);
    alert("I'm doing something else here");     
}
console.log(console);

更新:

私のものを含む提示されたすべてのソリューションは、@TomBatesが述べたようにログの動作を完全に再現しませんでした。引数は別々に渡されるのではなくオブジェクトにラップされて記録されるため、出力が異なります。私が古いログの動作を再現するために見つけることができる唯一の方法+拡張機能はこれを行っていました:

    console.log(window, this, console);//old log in action

console._log = console.log;//just backing up old log method
console.log = function(){
    var args_string = '';
    for(i in arguments){
        if(arguments.hasOwnProperty(i)){
            args_string += 'arguments['+ i + ']';
            if(i != arguments.length - 1){
                args_string += ',';
            } 
        }
    }
    var expression = 'console._log(' + args_string + ');';
    eval(expression);

    alert("I'm doing something else here"); 
   //your dazzling method extension here   
}

console.log(window, this, console); //new log in action

あまりエレガントではありませんが、期待どおりに動作します。古いログと新しいログの両方の出力が同じになりました。

2
追加された
あなたは console.log.length
追加された 著者 Raynos,
あまりにも多くのアポストロフィ。 :)
追加された 著者 freakish,
新しいコンソールメソッドに引数を追加したので、古いものと同じくらい有用になります
追加された 著者 marcio,
それは本当です、それを認識していませんでした。修正しました、ありがとうございます。
追加された 著者 marcio,
私はconsole.log.lengthが期待どおりに動作するようにいくつかのテストスーツをそのまま残しておく必要があると思うので、@Deeptechtonsが賢明に彼の答えでしたようにそのまま残すことが重要と思われます。
追加された 著者 marcio,
これは、 arguments オブジェクトが関数の引数をラッピングしているため、これがログ出力に干渉するためです。更新された答えを見て、新しいより良い解決策(あまりエレガントではない)を持っています。
追加された 著者 marcio,
すべての答えをありがとう。 @marcioAlmada:このソリューションはほとんど動作しますが、元の動作は異なります。たとえば、このソリューションを使用する前後でjquery要素をログすると、ログの動作に違いが見られます。 (Webkit上のFirebugまたはWebインスペクタのいずれか)
追加された 著者 Tom Bates,

あなたが厳密にFirebugでコンソールを拡張しようとしているのであれば、プロトタイプを持っていないので、これをうまくいくでしょう

console.logMe = function(){console.log(arguments)};
console.logMe("welcome to SO");

更新

私は間違った質問を理解していたので、私はそれを修正したいと思います。 OPはベースメソッドを抽象化してベースメソッドをオーバーライドしたいと思っていました(私はゴミと言っているようです、下のコードを見てください)

function myConsole() {}

myConsole.prototype = {
    _log: console.log,
    Log: function() {
        this._log(arguments)
    }
};

それ以外の方法で何度も何度もやらなくてはなりません。しかし、ここで作成するすべてのインスタンスには、拡張メソッドと独自の組み込み実装が用意されています。

使用法

var x = new myConsole();
x.Log("Hi this is Deeptechtons");
1
追加された
@OptimusCrimeは更新された答えを見る
追加された 著者 Deeptechtons,
@marcioAlmadaは更新された答えを見る
追加された 著者 Deeptechtons,
@ダウンウィートの理由を知ることは素晴らしいことです。
追加された 著者 Deeptechtons,
私はそれをdownvoted、しかし、それはあなたのコードは大丈夫だと私は間違って評価! (あまりにも速く見えて、別の答えが持っていた同じエラーがあったと思った)。投票を元に戻そうとしましたが、回答が編集されない限り(時間が過ぎてしまった)私のダウンボートを元に戻すことはできません。あなたは私のdownvoteを取り消すことができるようにマイナーな編集を行うことができますか?私はそれを本当に残念です。
追加された 著者 marcio,
ok、downvote undone :)
追加された 著者 marcio,
私ではありませんでしたが、問題はメソッドを拡張し、新しいメソッドを作成することではありませんでした。
追加された 著者 OptimusCrime,

javascriptは呼び出し可能な指向であるため、次のことが可能です。

console._log_without_my_extension = console.log
console.log = function() { console._log_without_my_extension(); .... }

例えば。

1
追加された
あなたのconsole._log_without_my_extension()はまだ役に立つようにパラメータを受け取る必要があります。
追加された 著者 marcio,
もちろん、必要なパラメータを受け取って持ち越す必要があります。
追加された 著者 Marian Theisen,

prototype プロパティは、オブジェクトにすでに存在する場合にのみ使用できます。 console はその1つではありません。このために他の答えを使用してください。 prototype について学ぶためにこれを読んでください:

http://phrogz.net/js/classes/ExtendingJavaScriptObjectsAndClasses.html

ところで、他の回答に示唆されているように、ラッパーを作成しない限り、関数を拡張する方法はありません。

0
追加された

JSでの拡張は、私が知っている限り、以下のようなデフォルトの機能ではありません。

var oldLog = console.log;
console.log = function(){
    //doStuff
    oldLog(arguments);
    //doStuff
}
0
追加された
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript