Hallo,
Sehe ich das richtig, primitive Werte haben interne Funktionen, Objekte hingegen Methoden?
Wie es nicht gemeint war: Funktionen sind ja nutzerseitig nichts anderes als Objekte. Was ich meinte: Methoden = interner JS-Code (oder auch in der eigentlichen Quelltextsprache), der an Objekte gebunden ist und den man überschreiben kann. Funktionen = Code, der in der Sprache, in welcher JS geschrieben ist (welche ist das überhaupt?) ausgeführt wird, also der eigentlich Interpreterkern.
Verstehe die Unterscheidung immer noch nicht. ;)
Primitive Werte »haben« genauso Methoden insofern, dass sie intern ständig in die entsprechenden Objekte »umgewandelt« werden.
Es könnte ja auch einen globalen Speicherbereich geben, der vom Interpreter verwaltet wird, wo alle length-Eigenschaften aller Arrays in einer selbst array- oder objektartigen Struktur bzw. tatsächlich als Array oder Objekt, aber in der eigentlichen Sprache, in der der Interpreter geschrieben ist, liegen.
Keine Ahnung, wie das hinter den Kulissen gelöst ist - Objekte, wie man ihnen in JavaScript begegnen, sind natürlich auch nur Abstraktionen. Wie da die C++-Umsetzung aussieht, weiß ich nicht, aber der Witz in JavaScript ist eben, dass man sich darüber auch wenig Gedanken machen muss. (Der Teil ist auch nirgendwo standardisiert. Warum auch.)
Und wenn length tatsächlich eine Eigenschaft von a ist, so muß sie besonders geschützt sein.
Siehe auch </archiv/2007/10/t159610/>
Sie ist als DontEnum, DontDelete festgelegt.
Man kann sie ja zum Beipiel nicht mit einem String überschreiben.
Kann man schon versuchen. Wird aber ignoriert werden, weil der String keine sinnvolle Zahl ergibt:
http://bclary.com/2004/11/07/ecma-262.html#a-15.4.5.1
Lokale Variablen hängen an einem internen »lokale Variablen«-Objekt, auf das man aber nicht direkt zugreifen kann. arguments ist eine solche »lokale Variable«.
Ein Objekt für alle Funktionen?
Nein, jeder Function-Scope hat sein eigenes arguments-Objekt, siehe Link im letzten Posting.
Sind die lokalen Variablen dann nur temporär (persistente Eigenschaften würden den Speicher zumüllen).
Natürlich, solange ein Scope noch irgendwo »konserviert« ist (Stichwort Closures), existieren die lokalen Variablen, ansonsten werden sie sofort aus dem Speicher geräumt.
»arguments« ist ja kein wirklich unabhängig vom Scope existierendes Objekt, sondern nur eine Zugriffsweise.
in anderen Sprachen bedarf es dazu nicht solch verwirrender Unterscheidungen und "doppelter" Datentypen. In PHP werden seit Version 5 Objekte standardmäßig als Referenzen übergeben.
PHP ist kein Vergleich, weil es keine konsequent objektorientierte Sprache ist. Das Problem ergibt sich nur in solchen. Ein String ist in PHP kein Objekt, hat keine Methoden und kann auch keine Member vom Prototyp erben.
Ich denke mal eher, Java, Ruby oder Python wären in dieser Hinsicht mit JavaScript vergleichbare Sprachen, mit denen kenne ich mich aber überhaupt nicht aus. (Tiiim!)
Ja, aber früher konnte man ja über funktionsname.lokaleVariable auf sie zugreifen.
Mit Sicherheit nicht.
Ich glaube mit arguments geht das immer noch.
Ja, aber Funktionsname.arguments war mal von Netscape JavaScript eingeführt und ist jetzt deprecated, in ECMAScript ist arguments eine lokale Variable.
Mathias