prototype erweitert JavaScript-eigene Objekte

Hier will ich vielmehr einmal drüber informieren, als mich drüber aufzuregen. In der TYPO3 Mailingliste wurde dieses Problem kürzlich angesprochen. Es geht in diesem Fall darum, prototype als Framework in TYPO3 zur Verfügung zu stellen (als Extension)

prototype is a famous powerfull library and we currently discuss if it should go into the range of extension that is supported by the extension coordination team.

Yesterday Peter Klein gave a serious warning not to use it, because it could damage other javascript code by directly altering the core objects of javascript.

Klingt fies, ist es auch ein wenig. Peter Klein selbst gab wenig später ein sehr treffendes Beispiel dazu, dass ich sinngemäß wiedergebe.

/* This function merges the properties of two objects, and returns the merged properties */

Object.prototype.objMerge = function(obj) {
	var merged = new Object();
		for (var i in this) {
			if (isNaN(i)) merged[i] = this[i];
		}
		
 		for (var i in obj) {
  			if (isNaN(i)) merged[i] = obj[i];
		}
	return merged;
}

/** Ein Objekt in JSON **/
objOne = new Object();
objOne = {
		languageKey: ‚default‘,
		tabChar: ‚Tabchar‘,
		backColor: ‚ButtonFace‘,
		borderColor: ‚Gray‘,
		backColorLn: ‚#f0f0f0′,
};

/** Soll mit Objekt zwei zusammengepackt werden **/
objTwo = new Object();
objTwo = {
		languageKey: ‚default‘,
		tabChar: ‚Tabchar‘,
		backColor: ‚ButtonFace‘,
		borderColor: ‚Yellow‘,
		backColorLn: ‚#FFFFFF‘,
};

/** „merging“ der beiden Objekte **/
 
mergedObj = objOne.objMerge(objTwo);

Man sieht hier, dass das zusammensetzten zweier Objekte über eine Methode des ersten Objekts realisiert wird. Warum das Problematisch ist, zeigt sich, wenn man das neue Obejkt einmal durchläuft und alle Attribute und Methoden ausgibt. wir erhalten:

languageKey = default
tabChar = Tabchar
backColor = ButtonFace
borderColor = Yellow
backColorLn = #FFFFFF
objMerge = function(obj) { var merged = new Object(); for (var i in this) 
{ if (isNaN(i)) merged[i] = this[i]; } for (var i in obj) { if (isNaN(i)) 
merged[i] = obj[i]; } return merged; }

Man sieht, dass die Methode ‚objMerge‘ mitgenommen wird (ist ja auch logisch). Das ist insofern problematisch, als dass man diese Methode nun in allen Object.prototype Objekten hat, was nicht nur überflüssig ist, sondern auf dauer auch Performance frisst.Besser ist hier also, eine Funktion zur Verfügung zu stellen, die einfach beide Objekte als Parameter erwartet und diese dann sauber zusammenklebt. Naja prototype 1.5+ gelobt besserung. Abwarten

Trackback-Adresse | RSS-Feed für die Kommentare abonnieren

Hinterlasse einen Kommentar:


(Wir behalten uns vor Kommentare von dummen Menschen entweder zu löschen oder exemplarisch für die Nachwelt zu konservieren. Dumme Kommentare mit Werbelinks müssen leider auf zweiteres Privileg verzichten.)

XHTML: Du kannst diese Tags verwenden:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>