як пашырыць метад у JavaScript?

Я хачу, каб дадаць дадатковыя функцыянальныя магчымасці метаду, напрыклад:

console.log()

так што арыгінальная «часопіс» функцыянальнасць захоўваецца, і я магу прымусіць яго зрабіць нешта новае, як добра. Ці магчыма гэта? Я прачытаў некалькі біт аб выкарыстанні прататыпа, але не зусім зразумеў яго.

Вялікі дзякуй,

3
fcombine дазваляе аб'яднаць функцыі і вяртае новы.
дададзена аўтар Raynos, крыніца
Падумайце пра гэта так: вы можаце дадаць нешта запярэчыць, але не можа змяніць тое, што ўжо існуе. Вы можаце дадаць log2() суцяшаць аб'ект, але не можа змяніць ужо існуючы часопіс ().
дададзена аўтар friendzis, крыніца

5 адказы

Гэта вельмі лёгка. Калі вы хочаце, каб ваш новы увайсці mehod быць на месцы старога увайсці метад проста зрабіць нешта накшталт гэтага:

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);

UPDATE:

Ўсе рашэнні прадстаўлены, у тым ліку шахты, ня прайгравалі паводзіны часопіса выдатна, як паказана @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, крыніца
Так, гэта таму, што аргументы аб'ект абгортвае аргументы функцыі, і гэта перашкаджае на выхадзе лог. Паглядзі на абноўлены адказ, ён мае новае лепшае рашэнне (менш элегантнае).
дададзена аўтар marcio, крыніца
Дзякуй за ўсе адказы. @marcioAlmada: гэта рашэнне амаль працуе, хоць арыгінальнае паводзіны адрозніваецца. Напрыклад, калі вы ўваходзіце ў jQuery элемент перад/пасля выкарыстання гэтага рашэння, вы ўбачыце розніцу ў паводзінах часопіса. (Альбо Firebug або Web Inspector на Webkit)
дададзена аўтар Tom Bates, крыніца

Калі вы строга спрабуеце пашырыць кансоль у Firebug гэта не прататып, так што вы будзеце добра рабіць гэта

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

абнаўленне

Так як я ўжо зразумеў пытанне няправільны спосаб я хацеў бы, каб гэта выправіць. О.П. хацеў абстрагавацца базавы метад прэч і перавызначыць базавы метад. (Здаецца, я кажу лухту, паглядзіце ў код ніжэй)

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, крыніца
@Everyone хто downvoted, нядрэнна было б ведаць прычыну downvote.
дададзена аўтар Deeptechtons, крыніца
Я downvoted, але s% гэта, ваш код у парадку, і я ацаніў гэта няправільна! (Выглядаў занадта хутка і падумаў, што гэта была тая ж памылка іншага адказу быў). Спрабаваў адмяніць галасаванне, але прыкладанне кажа, што я не магу адмяніць мой downvote, калі адказ не рэдагуецца (занадта шмат часу прайшло). Не маглі б вы ўнесці нязначныя рэдагавання, так што я магу адмяніць мой downvote ?? Я вельмі шкадую пра гэта.
дададзена аўтар marcio, крыніца
ок, downvote адмяніць :)
дададзена аўтар 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, крыніца

Вы можаце выкарыстоўваць Прататып ўласцівасць толькі тады, калі аб'екты ўжо ёсць. <Код> кансоль не адзін з іх. Выкарыстоўвайце іншыя адказы на гэта. І чытаць гэта, каб даведацца пра Прататып :

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

Дарэчы: не існуе ніякага спосабу пашырыць функцыі, калі не зрабіць абгортку, гэтак жа як прапанавана ў іншых адказах.

0
дададзена

Пашырэнне ў JS ня функцыянальнасць па змаўчанні, наколькі я ведаю, адзіны спосаб нешта накшталт наступнага:

var oldLog = console.log;
console.log = function(){
    //doStuff
    oldLog(arguments);
    //doStuff
}
0
дададзена