• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Hilfe bei kniffliger Code-Sequenz

geronimo

New member
Hallo Leute,

da ich in Javascript noch ein eher im Anfangsstadium bin und folgende Code-Sequenz nicht ganz verstehe, bitte ich um eure Hilfe ;).
Code:
var UTIL = (function (parent, $) {
	var my = parent.ajax = parent.ajax || {};

	my.get = function (url, params, callback) {
		// ....
		return $.getJSON(url, params, callback);
	};

	// etc...

	return parent;
}(UTIL || {}, jQuery));

Für mein Verständnis wir hier das Modul UTIL erweitert, bzw neu erstellt. Der privaten Var my wird die Member ajax vom Objekt parent, das dem Modul übergeben wird, zugewiesen oder erstellt.
Dann wird für das Objekt my eine Methde get erstellt. Im Endeffekt wir dann parent returniert. Könnt ihr sagen, was die erstellung der privaten Var my bringt.
Man kann im weiteren Verlauf ja nicht mehr darauf zugreifen.

danke für eure Hilfe
 
Im Endeffekt wir dann parent returniert. Könnt ihr sagen, was die erstellung der privaten Var my bringt.
naja, das ganze ist nicht ganz sauber.
also, wenn man das Modul UTIL erweitert und das bereits vorhandene UTIL schon das objekt ajax als eigenschaft besitzt, dann ist my eine referenz auf das bestehende ajax-objekt, von dem dann die get-methode überschrieben wird.
wenn das aber nicht der fall ist, also UTIL wird erstellt oder hat noch kein ajax-objekt, dann wird eine lokale variable erstellt, die (solange sie nicht (nur) innerhalb der erzeugerfunktion verwendet werden soll) nutzlos ist.

- - - Aktualisiert - - -

bzw. wenn man nicht davon ausgeht, dass das ajax-objekt eine get-methode hat, sondern diese hinzufügen will anstelle sie zu überschreiben, ist das ganze wieder ein sauberer weg. vorrausgesetzt, dass das ajax-objekt in UTIL immer über diesen weg angelegt wird und nicht direkt zugewiesen wird
 
naja, das ganze ist nicht ganz sauber.
also, wenn man das Modul UTIL erweitert und das bereits vorhandene UTIL schon das objekt ajax als eigenschaft besitzt, dann ist my eine referenz auf das bestehende ajax-objekt, von dem dann die get-methode überschrieben wird.
wenn das aber nicht der fall ist, also UTIL wird erstellt oder hat noch kein ajax-objekt, dann wird eine lokale variable erstellt, die (solange sie nicht (nur) innerhalb der erzeugerfunktion verwendet werden soll) nutzlos ist.

Danke für deine gute Erklärung.
Obiges Zitat verstehe ich noch nicht ganz.
Mein Verständnis sagt mir, dass es keinen Unterschied zwischen dem Existenz und dem Nicht-Existenz-Szenario von UTIL geben sollte.
Dann wird doch einfach das Objekt ajax erstellt. Anschließend weist man der Referenz my, die auf das neu erstellt ajax-objekt zeigt die Methode get hinzu. Also sollte nach Modulaufruf das
UTIL object ein Objekt ajax mit einer methode get haben.



Folgender Code sollte eigentlich analog funktionieren, oder?
Code:
var UTIL = (function (parent, $) {
	parent.ajax = parent.ajax || {};

	parent.ajax.get = function (url, params, callback) {
		// ....
		return $.getJSON(url, params, callback);
	};

	// etc...

	return parent;
}(UTIL || {}, jQuery));
 
Zuletzt bearbeitet:
Mein Verständnis sagt mir, dass es keinen Unterschied zwischen dem Existenz und dem Nicht-Existenz-Szenario von UTIL geben sollte.
das kommt darauf an, was man dort vor hat. ich ging ursprünglich davon aus, dass man die get-Methode des ajax-objektes überschreiben will.
das geht aber nur, wenn
1) UTIL schon existiert
2) das ajax-Objekt in UTIL schon existiert
damit müsste der codeteil, der das ajax-objekt erstellt vorher schon gelaufen sein. und damit ist es unsauber - nein, sogar gefährlich - das nicht vorrauszusetzten, sondern im fall, wo das nicht so ist, diese einfach anzulegen und damit fehler zu verdecken.

das ganze sieht aber anders aus, wenn man die get-methode hinzufügen möchte. dann muss aber die regel gelten, dass objekte im modul immer genau so erzeugt werden

- - - Aktualisiert - - -

Folgender Code sollte eigentlich analog funktionieren, oder?
ja und ist außerdem besser lesbar
 
Code:
damit müsste der codeteil, der das ajax-objekt erstellt vorher schon gelaufen sein. und damit ist es unsauber - nein, sogar gefährlich - das nicht vorrauszusetzten, sondern im fall, wo das nicht so ist, diese einfach anzulegen und damit fehler zu verdecken.

Gefährlich dann, wenn die methode get aufgerufen wird, bevor das Modul erweitert wird, oder?
 
Gefährlich dann, wenn die methode get aufgerufen wird, bevor das Modul erweitert wird, oder?

wenn ich überschreiben will, muss eine reihenfolge eingehalten werden. erst der orginalcode, dann die überschreibung. wenn eine reihenfolge nötig ist, sollte man diese auch einfordern.
mit UTIL || {} und parent.ajax || {} passiert das aber genau nicht. bzw. suggeriert diese schreibweise sogar noch, daß die reihenfolge keine rolle spielt.
 
Conclusio ist, dass das Objekt ajax parallel erstellt werden kann. Wenn Asynchronität nicht benötigt wird, ist eine direkte Erstellung/Zuweisung
logischer.

Ist das korrekt?
 
Conclusio ist, dass das Objekt ajax parallel erstellt werden kann.
parallel ist in js nichts(workerthreads mal außen vor).
ich würde eher auf folgendes raus wollen:
* wenn man alle objekte im modul über den weg parent.obj = parent.obj || {};erstellt, ist das modul mit allen seinen objekten beliebig erweiterbar
* wenn man eigenschaften überschreiben will sollte man auch vorher prüfen, dass diese schon gesetzt wurden

Wenn Asynchronität nicht benötigt wird, ist eine direkte Erstellung/Zuweisung
logischer.
die direkte zuweisung parent.obj = {eigenschaft: wert}; verhindert die erweiterbarkeit im gegensatz zu
Code:
parent.obj = parent.obj || {};
parent.obj.eigenschaft = wert;
.
das ist mehr eine designentscheidung. will man erweiterbarkeit oder ist es egal oder will man es auf keinen fall.
 
die direkte zuweisung parent.obj = {eigenschaft: wert}; verhindert die erweiterbarkeit im gegensatz zu

ich verstehe nicht warum eine direkte zuweisung die erweiterbarkeit verhindert.
folgender code könnte das objekt doch erweitern:

Code:
parent.obj.wert2 = "wert2";
 
Zurück
Oben