2016-04-15 7 views
2

Während ich dieses article lese, dachte ich, dass ich dies mit einem praktischen Beispiel in Verbindung bringe, also wurde ich neugierig auf das Objekt window. Da wir es nicht instanziieren können und es während der Laufzeit eines Programms nur eine Instanz hat, sollte es die Kriterien erfüllen.Ist ein Fensterbeispiel von Singleton-Objekten in Javascript?

Oben ist meine Meinung, aber ich möchte die Wahrheit wissen und auch, alle Punkte, die in dem gegebenen Artikel gesagt werden, sind auf das Objekt window im Allgemeinen anwendbar?

Update1

Wie im give Artikel zitiert:

Singletons sind nichts anderes als globaler Zustand

So im Allgemeinen des globalen Zustand macht das Testen härter durch Ausblenden Abhängigkeiten Wie gehen wir mit solchen Einschränkungen in Javascript um?

Antwort

2

Es ist nicht wirklich ein Singleton, weil Sie mit der Funktion Window.open eine neue Instanz erstellen können. Der Rückgabewert ist ein Verweis auf dieselben Objektskripts innerhalb der Skripts innerhalb dieses neuen Fensters, die als ihr globales Objekt window angezeigt werden.

Ich würde klarstellen, dass Singletons eine Art des globalen Staates sind, aber es ist nicht die einzige Art. Und wahr, alles, was auf dem aktuellen window Objekt definiert ist, ist überall in Ihrem Skript sichtbar. So stellt der window direkt Ihren globalen Zustand dar, obwohl es technisch kein Singleton ist.

Nun, wie können Sie in Bezug auf Ihre zweite Frage damit umgehen, dass JavaScript beim Testen globale Gültigkeit hat? Nun, das ist viel schwieriger. Selbst in Umgebungen, die kein window Objekt haben, wie Node.js, gibt es noch einige globale Objekte. Dinge wie die Aktivierung von strict mode können einen langen Weg gehen, um das versehentliche Erstellen von Variablen im globalen Gültigkeitsbereich zu vermeiden, und Sie können möglicherweise verhindern, dass eine Funktion dem globalen Status so hinzufügt (ich bin nicht sicher, ob dies ratsam ist, aber es funktioniert):

"use strict" 
Object.preventExtensions(window); 

function testfunc() { 
    window.someVar = 0; // Can't add property x, object is not extensible 
    console.log("testfunc", window.someVar); 
} 

Aber ich glaube nicht, Sie in der Lage sein würden vollständig die Möglichkeit der globale Status zu beeinflussen Ihren Code zu beseitigen. Ein gängiges Beispiel ist die window.name Eigenschaft, die an unerwarteten Stellen auftauchen können, wie folgt aus:

"use strict" 
Object.preventExtensions(window); 

function testfunc() { 
    console.log("testfunc", name); // perfectly valid 
} 

Einige statische Analyse-Tools wie JSLint können diese Arten von Fehlern fangen helfen.

+0

Nun, ich würde es als einen Ausnahmefall dann sehen, ich spreche im Allgemeinen, d. H. Während wir kümmern uns um unsere Javascript-Code. – CodeYogi

+0

@CodeYogi Ja, es sieht * in vielerlei Hinsicht wie ein Singleton aus, aber in Wahrheit ist es das nicht. Man könnte es einen "Pseudo-Singleton" nennen. –

+0

Welche Vorschläge hast du bezüglich des Tests mit globalen Zuständen wie 'window'? können wir es verspotten? – CodeYogi

Verwandte Themen