Antje Hofmann: Objekte?-Arrays?-Objekte?

Beitrag lesen

Hi regenfeld

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*

ja deshalb ändere ich mal den threadtitel, weil das Thema interessant ist

vorweg, ich bin kein Theoretiker, das heißt, ich reime mir zusammen was meiner Ansicht und meiner Praxiserfahrung nach stimmen könnte.

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, ...)

sehe ich eigentlich nicht so. Eher dahingehend, dass die zusätzliche objektorientierte Betrachtung der Arrays ein Bonuns ist

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.

hier sehe ich es als Pragmatiker.
Ein Array ist eine Liste von Elementen. Diese Elemente haben bestimmte Eigenschaften.
Gleichzeitig ist ein Array auch ein Object und dieses Objekt hat auch wieder bestimmte Eigenschaften oder auch nicht :-)

Theoretisch ist das sehr schwer zu erklären. Praktisch ist das jedoch extrem einfach zu erklären.

<abschweif>
JavaScript ist eben weiblich. Das heißt, es besitzt faßbare und unfaßbare Eigenschaften der Weiblichkeit.
JavaScript in Browsern (IE, NN4, Opera, NN6) ist die Umsetzung von
JavaScript, jedes regiert anders überraschend weiblich.
</abschweif>

übersetzt heißt das, weil JS eben eine Frau ist, muß man manches in Kauf nehmen ;-)

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

exakt

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

wieder richtig

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

wer will denn da so kleinlich sein

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!

ich denke hier wird einfach die Verarbeitung unterschiedlich gehandelt.

Denn das geht auch:

var blah = new Array();
 blah[0]="abc";
 alert(blah["0"]);

ich denke, ganz einfach, dass ein Stingelement immer als Eigenschaft angesehen wird. Wird aber ein Number-Wert übergeben erfolgt keine Umwandlung in ein String (Eigenschaft) umgekehrt aber schon.

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>

hm, hier könnte ich mich tatsächlich streiten. Es ist sehr schwer zusagen was wie gilt. Ich würde eher dazu tendieren, objekte lassen sich auch als assoziative Arrays behandeln.

<g> tatsächlich ist dieses verhalten sogar ein Diplom-, wenn nicht sogar eine Doktorarbeit wert

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";

prototype erweitert die Eigenschaft des Objektes MyClass
während my.vorname nur die Eigenschaften des Objektes my erweitert

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

funktioniert, oder zumindest irgendwie kompliziert implementiert wurde.

Dieser Teil erscheint mir sehr einfach. :-)      ich muß aber zugeben ich habe nicht ohne Grund die Änderung der Objekteigenschaften in die Runde geworfen.

Ich hab jetzt voll den Überblick verloren. Daher eine Z»» usammenfassung meiner Verständnisprobleme:

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

auch objekte

assoziative Arrays sind Objekte (normale Arrays) mit Objekteigenschaften

mit

blah[0]="abc";
blah["du"]=regenfeld

blah[0] nutzt du die Eigenschaften  eines normalen Arrays und mit blah["du"] die Objekteigenschaften des Arrays blah

beides kann nebeneinander existieren und ich finde dieses Feature einfach klasse (<g> js ist eben eine Frau)

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.

ich werde es mal im Auge behalten und expirimentieren
mal sehen was ich finde (Praktikerin eben)
insgesamt denke ich indizierte Arrays über Number angesprochen spricht auch nur die Number-Eigenschaft an. Während über string angesprochen eben die Stringeigenschaft anspricht und diese gegenenfalls umwandelt.

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!

ich glaube, dass ist insgesamt  ein wenig erforschtest thema
mal sehen wenn ich luft finde werde ich mal weiter experimentieren und gegebenenfalls posten

Viele Grüße

Antje