2015-07-08 2 views
5

JavaScript hat alle Mengen an verrückter Flexibilität. Ich habe beschlossen, es zu nutzen und eine Funktion beim ersten Anruf ändern zu lassen. Ist das eine schlechte Sache zu tun? Es funktioniert wie folgt:Falsche Funktion, um die Variablenreferenz zu ändern, von der sie aufgerufen wurde?

(function(){ 
    var nextAfter = function(){}; 
    Something.prototype.next = function(){ 
     //do pre-start actions. 
     this.next = nextAfter; 
    }; 
})(); 

Diese Funktion innerhalb einer Hauptschleife aufgerufen wird, so wird es viele Male, aber die Instanz ist immer nur „angeblich“ instanziiert werden einmal aufgerufen.

+1

"potenzielle Sicherheitsbedrohung"? – undefined

+1

Diese Funktion ändert sich nicht. Der 'Something'-Prototyp wird immer noch eine' next() '-Funktion haben, aber wenn er aufgerufen wird, definiert er ein' next() 'direkt auf dem Objekt, das eine Instanz von' Something' ist. – nnnnnn

+0

@nnnnnn Ich hätte das nie gefangen! Ich bin froh, dass du etwas dazu gesagt hast. An dieser Stelle denke ich, dass das, was ich frage, anders ist, wie zum Beispiel: Eine Funktion zu haben, ändert die Referenz der Variablen, von der sie aufgerufen wurde. – Andrew

Antwort

6

Es ist eine vollkommen vernünftige Sache zu tun.

Zum Beispiel kann es eine nützliche Möglichkeit sein, Zustandsänderungen in einer Zustandsmaschine zu implementieren, aber ich bin mir sicher, dass Sie viele andere Anwendungen finden könnten.

Sie können auch prüfen, wie Sie die gleiche Funktionalität mit Verschlüssen implementieren können - je nach Anwendungsfall kann es sauberer sein.

Bearbeiten; Beispiel eines Verschlusses, der den Prototyp nicht

Something = (function(){ 
    var next = function() { next = nextAfter; console.log("A"); } 
    var nextAfter = function() { console.log("B"); } 

    return { 
     next: function(){ next(); } 
    } 
})(); 

Der Vorteil des Verschlusses ändern ist, dass Sie die globale Prototyp-Funktion nicht ändern für diesen Objekttyp, und Sie können jetzt mehrere unabhängige Objekt, in dem sich Schließobjekt kann ihren eigenen Zustand behalten.

+0

Sie sagten "gleiche Funktionalität mit Verschlüssen", ich bin mir nicht sicher, ob ich genau verstehe, was Sie meinen. Mein Beispiel ist eine Schließung, aber ich denke nicht in der Weise, auf die Sie sich beziehen? – Andrew

+0

Ich habe ein Beispiel für einen Verschluss hinzugefügt – Soren

Verwandte Themen