2 Stimmen

Javascript: Brauche Hilfe bei der Erstellung einer fabrikähnlichen Funktion

Ich brauche so etwas wie

function updateRender(ClassName){
   if(!(this.currentRender instanceof ClassName)){
         doPreprocessing();
         this.currentRender = new ClassName();
         doPostProcessing();
   }
}

Ich könnte also updateRender mit einem neuen Renderobjekt aufrufen, das von einem anderen Typ sein kann.

updateRender( SolidRender );
updateRender( HollowRender );
updateRender( HollowRender ); //does nothing because currentRender is HollowRender

1voto

Flambino Punkte 18137

Sie haben Ihre Antwort bereits in den Kommentaren erhalten, daher ist dies nur eine kurze Information:

Sie verwenden this.currentRender die sich - wenn die Funktion im globalen Bereich liegt - auf eine Variable im globalen Bereich bezieht. D.h. auf die window Objekt des Browsers. Und Dinge in den globalen Bereich zu stellen, ist sehr selten eine gute Idee.

Technisch gesehen, sollten Sie die todos Ihren Code in einem einzigen Namespace oder sogar innerhalb einer Funktion, die sofort aufgerufen wird, damit er den globalen Bereich nicht verschmutzt. Sie können jedoch damit beginnen, dass Sie einfach die currentRender Variable aus dem globalen Geltungsbereich zu entfernen, indem Sie dies tun:

var updateRender = (function () {
    var currentRender = null;

    return function (klass) {
        doPreprocessing();
        currentRender = new klass();
        doPostProcessing();
    };

}());

die updateRender Funktion befindet sich immer noch im globalen Bereich, aber zumindest die currentRender ist sicher innerhalb eines Abschlusses versteckt, so dass nur updateRender ändern kann (auch bekannt als privilegierter Zugriff).

Was die Verwendung von klass anstelle von Class Das liegt ganz bei Ihnen. Verwendung von klass ist nur eine gängige Methode, um die " class ist ein Schlüsselwort"-Problem in Ruby.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X