molily: Klasse eines Objektes feststellen

Beitrag lesen

Hallo zusammen,

Vorweg: Ich habe keine wirkliche Ahnung und demnach wirbeln wahrscheinlich die Begriffe durcheinander, bitte korrigiert mich, wenn ich unverständlich schreibe bzw. etwas offenbar ungenau bezeichnet oder dargestellt habe.

Ich möchte von einem beliebigen Objekt in Erfahrung bringen, von welcher Klasse es abstammt bzw. welche(s) Prototypobjekt(e) es hat, und zwar ohne von bekannten Eigenschaften und Methoden darauf zu schließen.

Nehmen wir beispielsweise ein Arrayobjekt:

var meinarray=['a', 'b', 'c'];

Nun würde »typeof meinarray« logischerweise »Object« liefern. Es ließen sich natürlich Array-Methoden nachweisen, was ich aber nicht möchte. Natürlich ließe sich auch feststellen, dass das Objekt eine Instanz des Array-Objektes ist:

window.alert(meinarray instanceof Array);
window.alert(Array.prototype.isPrototypeOf(meinarray));

Aber dann müsste der Typ Array bekannt sein, ich gehe aber davon aus, dass er nicht bekannt ist und somit auch keine solchen Prüfungen vorgenommen werden können. Umständlich ginge es natürlich folgendermaßen:

Array.prototype.toString=Object.prototype.toString;
/\s([^]]+)]$/.exec(meinarray.toString());
window.alert(RegExp.$1);

Aber es ist genauso unpraktisch bzw. unmöglich, die toString-Methode eines jeden Prototypenobjektes zu verändern, sodass es wieder darauf hinausläuft, dass zumindest eine Vermutung existiert, um welchen Prototyp es sich handelt.

Wenn es um selbstdefinierte Konstruktoren geht, ist es natürlich möglich, einem Objekt eine Eigenschaft mitzugeben, anhand welcher es identifizierbar ist:

function beispielobjekt () {this.type=new String('beispielobjekt');}

Angenommen, es wird ein Objekt definiert:
var meinobjekt=new beispielobjekt();

Wie kann ich aber nun unabhängig den genannten indirekten Techniken direkt abfragen, welches das jeweilige Prototypobjekt ist?

Im ECMA262-Standard habe ich nur einen internen Wert [[Class]] gefunden, welcher sich aber anscheinend nicht von außen abfragen lässt...

(Habe ich vielleicht irgendetwas komplett falsch verstanden?)

Grüße,
Mathias