JS: Was soll if (this == global) im Konstruktor?
-
Hallo Leute,
Ich lese gerade einige Dinge zu OOP in JavaScript (Vererbung etc.) und nun sehe ich hier in den Unterlagen Konstrukte wie folgendes:
function Rect() { if (this == global) return new Rect(); this.sayHi = function() { alert('Hallo'); }; }
Die Idee hier ist nach meinem Verständnis, dass man den Konstruktor auch ohne
new
aufrufen kann, alsonew Rect()
oder auch einfach nurRect()
. Das ist ja okay, aber es gibt jaglobal
gar nicht? Logischerweise funktioniert der Code auch nicht...Müsste es korrekterweise nicht heissen:
if (!(this instanceof Rect)) return new Rect();
Oder verstehe ich etwas grundsätzlich nicht?
Vielen Dank für Aufklärung
MfG
-
Sieht für mich aus, wie verunglücktes Singelton:
function Rect() { if (global) { return global; } global = new Rect(); // ohne 'var' davor ist 'global' global this.sayHi = function() { alert('Hallo'); }; } var a = new Rect() var b = Rect() a == b ist true
-
Singleton? Das ist ja noch viel übler, weil in den Unterlagen wird das in Vererbungshierarchien eingesetzt. Wirft das nicht alles über den Haufen?
-
/rant/ schrieb:
Singleton? Das ist ja noch viel übler, weil in den Unterlagen wird das in Vererbungshierarchien eingesetzt. Wirft das nicht alles über den Haufen?
Ich habe das noch nie gesehen.
Wo hast du das denn her?
-
Ist Rect denn die Basisklasse oder die Ableitung?
-
Jockelx schrieb:
Ist Rect denn die Basisklasse oder die Ableitung?
Ist abgeleitet, aber ich habe die Vererbung hier entfernt. Es kann z.B. auch noch andere, unabhängige "Klassen" geben, die das einsetzen, welche nicht in der gleichen Hierarchie stehen
@Shade: Sind Vorlesungsslides, aber die sind nicht über alle Zweifel erhaben...
-
Irgendwo muss das global doch gesetzt werden! In der Basisklasse auch nicht?
Logischerweise funktioniert der Code auch nicht...
Was ist denn unerwartet, bzw. was soll er denn überhaupt machen?
-
Wird nirgends gesetzt. Vielleicht wurde der Code auch aus dem Kontext gerissen. So wichtig wird es aber auch nicht sein. Mir ging es mehr darum, ob das irgendwie eine bekannte Variante ist.
Der Code verfolgt keinen bestimmten Zweck, er dient nur der Veranschaulichung
-
/rant/ schrieb:
@Shade: Sind Vorlesungsslides, aber die sind nicht über alle Zweifel erhaben...
Schmeiss das weg und lies lieber was ordentliches.
zB: https://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-Oriented_JavaScript
-
Vermutlich will da jemand überprüfen, ob die Funktion als Konstruktorfunktionen aufgerufen wurde, aber um das genau zu sagen sieht man hier zu wenig von dem Quellcode, und dieser Weg wäre auch noch falsch.
Wenn du vermeiden willst, dass Konstruktorfunktionen als normale Funktion aufgerufen werden, würde ich den Strict-Modus verwenden: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode