HighDots Forums  

Objekt-Typ(-liste) bekommen

Javascript (German) Programmiersprache JavaScript. (de.comp.lang.javascript)


Discuss Objekt-Typ(-liste) bekommen in the Javascript (German) forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Robert Degen
 
Posts: n/a

Default Objekt-Typ(-liste) bekommen - 04-16-2007 , 04:46 AM






Hi!

Ich habe ein kleines Problem. Ich möchte den Objekt-Typ eines
Javascript-Objekts feststellen, finde aber keine Möglichkeit dazu in
allen mir zue Verfügung stehenden Dokumentationen. Ich vermute, daß
'das' gar nicht vorgesehen ist, oder vielleicht nicht geht, aber mich
ermutigt die Tatsache, daß der instanceof-Operator ja den Typ korrekt
'vergleichen' kann. Warum dann also nicht 'bestimmen'.

Weiß jemand Rat?

Danke.
Robert

Reply With Quote
  #2  
Old   
Martin Honnen
 
Posts: n/a

Default Re: Objekt-Typ(-liste) bekommen - 04-16-2007 , 06:45 AM






Robert Degen wrote:

Quote:
Ich habe ein kleines Problem. Ich möchte den Objekt-Typ eines
Javascript-Objekts feststellen, finde aber keine Möglichkeit dazu in
allen mir zue Verfügung stehenden Dokumentationen. Ich vermute, daß
'das' gar nicht vorgesehen ist, oder vielleicht nicht geht, aber mich
ermutigt die Tatsache, daß der instanceof-Operator ja den Typ korrekt
'vergleichen' kann. Warum dann also nicht 'bestimmen'.
Was genau willst du bestimmen, was ist aus deiner Sicht der
"Objekt-Typ", wie definierst du den?
Es gibt den Operator namnes typeof, also
alert(typeof expression)
damit bekommst du den Typ, soweit die ECMAScript-Spezifikation den festlegt.


--

Martin Honnen
http://JavaScript.FAQTs.com/


Reply With Quote
  #3  
Old   
Robert Degen
 
Posts: n/a

Default Re: Objekt-Typ(-liste) bekommen - 04-17-2007 , 03:55 AM



Martin Honnen schrieb:
[...]
Quote:
"Objekt-Typ", wie definierst du den?
Es gibt den Operator namnes typeof, also
alert(typeof expression)
[...]

Als ich das gelesen habe, war meine Hoffnung groß! :-) Leider
funktioniert es nicht so wie gewollt... weil:

ich habe ein Objekt XYZ, das mit einer Funktion

function XYZ() {
this.blablabla = "blablabla";
// usw
}

per

var o = new XYZ();

initialisiert wird. Jetzt komme ich zur Laufzeit nicht mehr an den
XYZ-Bezeichner (die Zeichenkette der "Constructor"-Fkt. interessiert
mich) und ich vermute auch das das Sinn macht, wenn es da nicht einen
Trick gibt, denn Javascript ist ja objekt-basiert nicht
objekt-orientiert. Die Objekte können zur Laufzeit in Form ihrer
Komponenten manipuliert werden, d.h. ein Objekt passt evtl. gar nicht
mehr zu seinem "Bauplan", weil es zur Laufzeit geändert wurde. Warum
dann also überhaupt noch einen Typ-Check machen, wenn die ganze
Architektur das Konzept nicht verinnerlicht. Nun wäre es aber trotzdem
interessant, ob das Objekt, das angelegt wurde, "noch weiß", wer seine
Constructor-Funktion war. Dann wäre das Problem nämlich für mich gegessen.

Meine nächste Idee war, das mit dem Prototyp zu lösen aber auch an den
Namen komme ich nicht ran.

Zum verzweifeln. Ich hasse es inkompetent, sprich keine Ahnugn von JS zu
haben...

Regards
Robert


Reply With Quote
  #4  
Old   
Ralf Beutler
 
Posts: n/a

Default Re: Objekt-Typ(-liste) bekommen - 04-17-2007 , 05:39 AM



Hi,

Robert Degen wrote:

Quote:
ich habe ein Objekt XYZ, das mit einer Funktion

function XYZ() {
// usw
}
var o = new XYZ();

(die Zeichenkette der "Constructor"-Fkt. interessiert mich)

Nun wäre es aber trotzdem interessant, ob das Objekt, das angelegt wurde,
"noch weiß", wer seine Constructor-Funktion war.
du wirst dein Problem nicht lösen können.
Ich bin dazu übergegangen, solchen KonstruktorFunktionen eine
Eigenschaft __name zu geben, die ich in den Objekten wieder abfragen
kann. Ist ein bisschen aufwändig, funktioniert aber für meine Zwecke.
Kompliziert wird es nur, wenn man eine "Quasi-Mehrfach-Vererbung"
realisieren will, aber wer braucht das schon im Normalfall.

br | rb
--
Sie freuten sich riesig, wenn eine Maschine nach sechs Stunden etwas
fertig brachte, wozu jeder Mensch auf der Straße für 2 Cent fähig
gewesen wäre. Anschließend ließen sie sich Bananen- und Sushi-Pizza
kommen und schliefen vor der Tastatur ein. [aus T.P., Heiße Hüpfer]


Reply With Quote
  #5  
Old   
Robert Degen
 
Posts: n/a

Default Re: Objekt-Typ(-liste) bekommen - 04-17-2007 , 09:41 AM



Ralf Beutler schrieb:
Quote:
Eigenschaft __name zu geben, die ich in den Objekten wieder abfragen
kann. Ist ein bisschen aufwändig, funktioniert aber für meine Zwecke.
Genau das will ich vermeiden, aber es scheint wirklich nicht zu gehen.
Zur Vererbung habe ich was interessantes gesehen heute [1]. __name
dürfte dann ne Liste werden.

Ich mag das nicht... ich will das über den Funktionsnamen lösen, ... ich
gebe nicht auf ;-)

Robert


[1]http://twologic.com/weblog/2006/05/23/object-inheritance-with-javascript/


Reply With Quote
  #6  
Old   
Thomas 'PointedEars' Lahn
 
Posts: n/a

Default Re: Objekt-Typ(-liste) bekommen - 07-30-2007 , 02:31 PM



Robert Degen wrote:
Quote:
ich habe ein Objekt XYZ, das mit einer Funktion

function XYZ() {
this.blablabla = "blablabla";
// usw
}

per

var o = new XYZ();

initialisiert wird. Jetzt komme ich zur Laufzeit nicht mehr an den
XYZ-Bezeichner (die Zeichenkette der "Constructor"-Fkt. interessiert
mich) und ich vermute auch das das Sinn macht, wenn es da nicht einen
Trick gibt,
Jedes native ECMAScript-Objekt hat oder erbt über die Prototyp-Kette
eine constructor-Eigenschaft, welche den jeweiligen Konstruktor
referenziert (ES3, 15.2.4.1). Der Konstruktor wiederum ist ein
Function-Objekt mit einer String-Repräsentation. In JavaScript, JScript
und in Operas ECMAScript-Implementation lässt sich daher der Bezeichner
aus diesem String herausparsen (getestet in FF 2, IE 7, Opera 9.21):

function getConstructorID(o)
{
return String(o.constructor).match(/function\s+([^\s\(]+)/)[1];
}

Vermutlich funktioniert das auch in KJS von KHTML (Konqueror, Safari),
womit dann alle brauchbaren Script-Engines abgedeckt wären. (Könnte
jemand das bitte mal testen?)

Normalerweise braucht man aber den Bezeichner gar nicht, denn weil der
Konstruktor eben ein per Bezeichner referenzierbares Objekt ist (und
Objekte eine Identität haben), kann man ganz einfach mit ihm vergleichen:

// o ist ein Foo-Objekt
if (o.constructor == Foo)
{
// ...
}

ECMAScript-3-Implementationen[1] unterstützen sogar noch den
instanceof-Operator, mit dem man einen "is-a"-Vergleich machen kann:

// o ist ein Foo-Objekt oder hat einen von Foo.prototype erbenden
// Prototyp
if (o instanceof Foo)
{
// ...
}

[1] http://pointedears.de/scripts/es-matrix#ecmascript

Quote:
denn Javascript ist ja objekt-basiert nicht objekt-orientiert.
Das wird vielfach behauptet (leider auch in der Wikipedia, Überzeugungs-
und Änderungsversuche sind bisher gescheitert). Dabei wird jedoch
übersehen, dass Objektorientierung nicht zwangsläufig auch
klassenbasierte Vererbung bedeutet. Für mich sind und bleiben
ECMAScript-Implementationen daher bis auf weiteres objektorientierte
Programmiersprachen.


HTH

PointedEars


Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.4
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.