Frage zum new Operator

OnlyFoo

Erfahrenes Mitglied
Ich hab mal eine Frage:

Ist es korrekt, dass der "new"-Operator in folgendem Szenario zwar auch weggelassen werden kann, aber es im Prinzip auch nicht stört, falls er dort bleibt?

Code:
var anObject = { "bla": "hallo" };
var aClass = function() { return anObject; };

var anInstance = new aClass();
alert( anInstance.bla );

Mir ist das nämlich bereits mehrfach aufgefallen, weil ich manchmal Klassen geschrieben habe, die etwa so aufgebaut sind:

Code:
<html>
	<head>
		<script>
			
			function ProgressBar() {
				var obj = document.createElement( "div" );
				obj.style.border = "1px solid #000";
				obj.style.width = "0%";
				obj.style.height = "24px";
				
				obj.setProgress = function( frac ) {
						this.style.width = (frac * 100) + "%";
					};
				
				return obj;
			}
			
			window.onload = function() {
					var obj = new ProgressBar();
					document.getElementById( "myDiv" ).appendChild( obj );
					
					obj.setProgress( 0.3 );
				};
			
		</script>
	</head>
	<body>
		<div id='myDiv'></div>
	</body>
</html>

Und auch dort macht es keinen Unterschied, ob ich den new Operator weglasse (was eigentlich logischer wäre), oder nicht. Mit sieht es jedoch um einiges schöner aus, da man sieht, dass ProgressBar nun eine "eigene Klasse" ist, und obj eine Instanz der Klasse ProgressBar. =)
 
Hi,

der Operator new erzeugt ein neues Objekt und ruft einen Konstruktor auf. Dabei werden übergebene
Argumente weitergereicht und das neu erzeugte Objekt als Wert des Schlüsselworts this übergeben.
Über das Schlüsselwort kann der Konstruktor nun das Objekt initialisieren - hier liegt auch der Unterschied
zum Initialisieren ohne new.
Code:
var aClass = function(){
  this.name = "aClass";
}

var objClass_01 = new aClass();
var objClass_02 = aClass();

alert(objClass_01.name);
alert(objClass_02.name);  // Erzeugt Fehlermeldung

Was in deinem ersten Beispiel abläuft.
Code:
var anObject = { "bla": "hallo" };
var aClass = function() { return anObject; };

var anInstance = new aClass();
alert( anInstance.bla );
Zunächst rufst du mit new den Konstruktor aClass auf. Dieser gibt am Ende ein Objekt (anObject)
zurück und weist es der Variablen anInstance zu. Das eigentliche durch den Konstruktor erzeugte
Objekt landet damit jedoch im Nirvana.

Wird aClass ohne new aufgerufen, ist das identisch mit einem Funktionsaufruf. Zurückgeliefert wird
am Ende wieder das Objekt anObject, womit das Resultat zwar das gleiche ist, der Weg dorthin
jedoch völlig unterschiedlich.

Vielleicht kannst du etwas damit anfangen.

Ciao
Quaese
 
Joah, der erste Teil deines Beitrags, das war mir soweit klar...
Es ging mir mehr um den zweiten Teil, bezogen auf mein zweites Beispiel. Wenn ich nun also new ProgressBar() aufrufe, hat es den selben Effekt, als wenn ich ProgressBar() aufrufe, nur dass zwischenzeitlich ein Objekt erstellt wurde, was danach jedoch sofort wieder im Nirvana verschwunden ist. Schöner sieht es aber auf jedenfall aus.
Gruß, Olli
 

Neue Beiträge

Zurück