javascript әдісін қалай кеңейту керек?

Мен әдіске қосымша функцияларды қосқым келеді, мысалы:

console.log()

сондықтан түпнұсқалық 'log' функциясы сақталады және оны жаңадан да жасауға болады. Бұл мүмкін бе? Мен прототипті пайдалану туралы бірнеше бит оқыдым, бірақ оны толық түсінбедім.

Көп рақмет,

3
fcombine функцияларды біріктіруге және жаңадан қайтаруға мүмкіндік береді.
қосылды автор Raynos, көзі
Осыны ойланып көріңіз: сіз ОБЖЕКТке бір нәрсе қосасыз, бірақ қазірдің өзінде бар EXISTS мүмкін емес. Сіз log2() файлын консольге қосуға болады, бірақ бұрыннан бар журналды() өзгерте алмайды.
қосылды автор 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);

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, көзі
Яғни, arguments нысаны функция дәлелдерін орындайды және бұл журналдың шығуына араласады. Жаңартылған жауапқа назар аударыңыз, ол жаңа жақсы шешімге ие (кем талғампаз).
қосылды автор marcio, көзі
Барлық жауаптарыңызға рахмет. @marcioAlmada: бұл шешім дерлік жұмыс істейді, бірақ бастапқы мінез-құлық өзгеше. Мысалы, jQuery элементін осы шешімді пайдаланбас бұрын/кейінірек жазсаңыз, журналдық әрекеттегі айырмашылықты көресіз. (Webkit-те Firebug немесе Web Inspector)
қосылды автор 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, көзі
@Дәрімді төмендетіп жіберген әрбір адамға төмендеудің себебін білуге ​​болады.
қосылды автор Deeptechtons, көзі
Мен оны төмендетті, бірақ% s, сіздің кодыңыз жақсы және мен оны дұрыс бағаладым! (тым тез қарап, басқа бір жауапты қателескен деп ойладым). Дауысты қайтаруға тырысты, бірақ бағдарлама жауапты редакцияланбаса (өте көп уақыт өтпейінше), менің кемшілігімді жоюға болмайды дейді. Кішкентай түзетуді жасай аламын, сондықтан менің төмендеуімді жоюға бола ма? Мен бұған өте өкінемін.
қосылды автор marcio, көзі
әрине, төменге қалдырылды :)
қосылды автор 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 - олардың біреуі емес. Бұл үшін басқа жауаптарды пайдаланыңыз. prototype туралы білу үшін оны оқыңыз:

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

Айтпақшы, егер сіз басқа жауаптарда ұсынылғандай, қаптаманы жасамасаңыз, функцияларды ұзартуға ешқандай мүмкіндік жоқ.

0
қосылды

JS кеңейтімі әдепкі функция емес, өйткені мен білемін, жалғыз жолы келесідей:

var oldLog = console.log;
console.log = function(){
    //doStuff
    oldLog(arguments);
    //doStuff
}
0
қосылды