2016-11-15 2 views
0

ich eine Funktion Konstruktor haben, die mit einer Funktion ein Objekt erstellt, sagen wir, do_it:Clone JavaScript-Funktion

function do_it_maker() { 
    this.do_it = function() { /* do something */ }; 
    this.other_do = function() { /* do anything else */ }; 
} 

Und ich möchte einen Wrapper für ein do_it_maker Objekt erstellen, das do_it Verhalten durch parasitäre Erbe bereichern:

Meine Frage ist, wird der do_it_obj.do_it() Aufruf einen rekursiven Aufruf verursachen? oder die Referenz auf die ursprüngliche do_it Funktion ist noch am Leben?

Ich habe verwandte Fragen hier in StackOverflow gefunden, aber ich habe widersprüchliche Antwort darüber gelesen, ob die Methode geklont werden muss oder nicht.

Also, was wird passieren? Für den Fall, dass die Referenz rekursiv wird nach der Änderung do_it, die am verständlichsten und mit der geringsten Menge an Code erforderlich ist, um diese Methode zu klonen? Ich bin ein C++ und nicht-glücklich-mit-nur-kopieren-einfügen-Code-Typ und einige Javascript-Funktionen aussehen mir noch dunkel (ich bin nicht klumpig, aber Sie können es ein bisschen schwer).

+0

Was ist 'self'? Das scheint nicht zu funktionieren. – Bergi

+0

Sie sollten den 'new'-Operator nicht verwenden, wenn Ihre Factory 'Objekte zurückgibt' trotzdem. – Bergi

+1

Hast du es gerade ausprobiert? Es sollte ziemlich einfach sein herauszufinden, ob der Aufruf rekursiv ist (und stackoverflows) oder ob die übergeordnete Methode wie erwartet aufgerufen wird. – Bergi

Antwort

3

es wird die ursprüngliche Funktion aufrufen, wird keine Rekursion auftreten

function do_it_maker_wrapper() { 
    var do_it_obj = new do_it_maker(); 

    // in this line you save/keep the reference to 'do_it' original function on a 
    // completely new reference. 
    do_it_obj.do_it_original = do_it_obj.do_it; 

    // this line replaces the reference to original 'do_it' with a reference to a 
    // new function that we create here 
    do_it_obj.do_it = function() { 

     // this still references the original 'do_it' function so that is called 
     do_it_obj.do_it_original(); 
     /* smth_else */ 
    } 
}. 

var do_it_obj = new do_it_maker_wrapper(); 

// this property references the function that we created as a replacement for the original 'do_it' 
do_it_obj.do_it(); 

EDIT: mit ES6 jetzt ziemlich überall zu sein brauchen Sie nicht die Reifen so mehr zu springen und nur ‚Klasse‘ verwenden und "erweitere" wie in jeder anderen OO-Sprache. Es hilft sogar Laufzeiten wie v8, um Ihren Code besser zu optimieren, und es ist so schnell wie das Erstellen eines einfachen Hash mit geschweiften Klammern '{