regenfeld: variablenbezeichnung erst zur laufzeit erzeugen

Beitrag lesen

Hallo Antje

toller Thread, der gefällt mir

Mir auch :o) Oft entsteht eben durch Zufall, oft aus einem Missverständnis ganz interessante Fragen, hier ist der (so ziemlich einzige?) Platz wo es Leute gibt, die sich dann auch darauf einlassen, wenn der Thread ein wenig abdriftet. Drum fühl ich mich hier auch so pudelwohl *g*

Hmm, ich hab zu engstirnig gedacht anscheinend. Der Punktoperator grefit IMHO nicht auf ein Array zu, sondern generell auf Objekte, noch genauer: Man kann mittels Punktoperator auf Methoden, und Attribute von Objekten zugreifen. Da ja window, forms, elements, ... Objekte der JS-Sprache sind, dachte ich anfangs es müsse auch ein Punkt dazwischen sein.

Das stimmt auch. Um das Verständnis zu vertiefen. Dies gilt ausschließlich für assoziative Arrays.

var blah = new Array();
blah['blub'] = "xyz";
alert(bla.blub);

Aber:  blah[0]="abc";
       alert(blah.0);

geht nicht.

Aber rein theoretisch ist das Konzept hier ein wenig löchrig. Einerseits die strikt durchgezogene Objekt-Orientierung, da geht einer her und macht ein Array einfach zu einem Object, und schafft so die geniale Möglichkeit, objekt-orientiert mit diesen (dann komplexen) Datentypen umzugehen, und dann andererseits, wird eine Ausnahme gemacht, für indizierte Arrays, die werden dann behandelt wie simple Datentypen (strings, integers, ...)

Ich fänds schöner, bzw. das Konzept irgendwie "kompletter" wenn sie die Sache mit dem []-Operator entweder ganz durchziehen würden, oder gar nicht. Methoden lassen sich ja schliesslich auch nicht über [] aufrufen. Ich finde das sehr verwirrend, dass Arrays einerseits wie Objekte behandelt werden, bis auf den (der strengen Definition nach) eigentlichen Sinnes eines (indizierten) Arrays.

Da hinkt bei mir die Sache noch ein wenig, da bick ich nicht so ganz durch, was der Sinn dahinter sein soll.

also greift bla.blub eigentlich - grob gesprochen - nicht auf ein Array zu, sondern genauergesagt auf das Attribut (Variable) 'blub' das Array-Objektes 'bla'.

genau, die Zuweisung blah["blub"] erzeugt also keine Eintrag in der Liste der Element des assoziativen Arrays, sondern legt die Eigenschaft 'bla' an.

'blub' nicht 'bla' - wenn ich mich nicht irre ;-)

Arbeitshypothese:
<script>
var a = new Object();
a['name'] = "regenfeld";
a[0] = "hat die Adresse";
a['email'] = "regenfeld@gmx.net";

alert (a.name + " " + a[0] + " " + a['email']);
</script>

Also kann das indizierte Array-Element nicht als property abgelegt werden, nona, schliesslich sind ja auch keine Zahlen als Bezeichner erlaubt. Die Frage ist halt, als was werden sie dann abgelegt? Irgendwie müssen sie ja rein ins Objekt!

Anmerkung: Hab gerade in meiner Javascript-Bibel nachgelesen - nachdem ich obiges geschrieben habe! Ich habs aber stehengelassen, um meinen (wies scheint) Denkfehler zu verdeutlichen. Es werden nämlich nicht Arrays als Objekte gehandhabt, sondern Objekte intern als assoziative Arrays!

<zitat quelle="http://www.oreilly.com/catalog/jscript3/">
Javascript Objects are actually implemented internally as associative arrays. The . notation for accessing properties makes them seem like the static objects of C++ and Java, and they work perfectly well in that capacity. But they also have the powerful ability to assotiate values with arbitrary strings.
</zitat>

function MyClass(name)
{ this.name=name }

var my = new MyClass("regenfeld");
var my2 = new MyClass("regenfeld2");

hier klappt es bequem mit

alert(my.name)
alert(my2.name)

alert(my["name"])
alert(my2["name"])

machst du aber folgendes:

my.vorname="keine Ahnung";
geht alert(my["vorname"]) und alert(my.vorname)

für my2 aber nicht.

Obige anmerkung würde auch das erklären. Allerdings nicht dass das:

MyClass.prototype.vorname="keine Ahnung";

alert(my2["vorname"]);
alert(my2.vorname)

funktioniert, oder zumindest irgendwie kompliziert implementiert wurde. Ich hab jetzt voll den Überblick verloren. Daher eine Zusammenfassung meiner Verständnisprobleme:

Varainte 1) Assoziative Arrays sind Objekte. Unklar: Was sind dann "normale" (indizierte) Arrays?

Variante 2) Objekte werden intern als assoziative Arrays behandelt. Unklar: Wie kommen dann die Methoden ins Spiel. Und auch die Unklarheit, wie indizierte arrays dann abgelegt würden bleibt. Alles in allem wär mir obige Variante noch eher verständlich.

PS: Sieht aus, als wärs wirklich lohnenswert, mich mal näher mit dem Objekt-Schema von JS auseinanderzusetzen ;-)

Ja ist es, hinter js steht mehr als die meisten erwarten und glauben.

ja, das hab ich so langsam auch entdeckt, und es gefällt mir sehr gut, das ganze Konzept von JS, ... bis auf diese Sache hier *fg* die ich nicht kapier ;-) Ausserdem hatt ich schon kürzlich einen sehr interessanten Thread zu diesem Thema, find ich höllisch spannend, die OO-Klassen-Thematik in Javascript!

lg regenfeld

PS: Auf das Ausgangsproblem zurückkommen, steht auch was in meiner Bibel:

<zitat quelle="http://www.oreilly.com/catalog/jscript3/">
object.prperty
object["property"]

The important difference to note between these two syntaxes is that in the first, the property name is an identifier, and in the second, the property name is a string.

[...]

When you use the . operator to access a property of an object, however, the name of the property is expressed as an identifier. Identifiers must be typed literally into your Javascript program -- they are not a data type, so they cannot be manipulated by the program.

On the other hand, when you access a propert of an object with the [] array notation, the name of the property is expressed as a string. Strings are Javascript data Types, so they can be manipulated and created while a program is running. So, for example, you could write the following code in Javascript:

var addr = "";
for (i = 0; i<4; i++) {
   addr += customer["address"+i]
  }

This code reads and concatenates the address0, address1, adress2 and address3 properties of the customer object.
</zitat>

... schade dass es in Englisch ist, aber hier sind ohnehin auch auf deutsch so viele Schlagwörter gefallen, dass der suchende diesen Thread schon finden müsste ;-)