Axel Richter: Konstruktor eines Objektes feststellen

Beitrag lesen

Hallo Peter,

eine alle js-objekte umfassende loesung saehe dann
   so aus:

Object.prototype.getConstructorName = function() {
      var thisConstructor = this.constructor;
      var thisConstructorString = thisConstructor.toString();
      var regExpDefault = /^\s*function\s+([a-zA-Z0-9_(]{2,}[^)]))/;
      var regExpMsie5x = /^\s*[object\s+([a-zA-Z0-9_]{1,})/;
      return ((thisConstructor) ? ((regExpDefault.test(thisConstructorString)) ? (regExpDefault.exec(thisConstructorString)[1] + ")") : ((regExpMsie5x.test(thisConstructorString)) ? (regExpMsie5x.exec(thisConstructorString)[1] + "()") : (null))) : (null));
   };
// liefert den namen des objekt-konstruktors zurueck (bei einem oo-klassenkonzept entspraeche dies dem klassennamen);

oder auch so:

Object.prototype.getObjectType = function() {
      var thisConstructor = this.constructor;
      var thisConstructorString = thisConstructor.toString();
      var regExpDefault = /^\s*function\s+([a-zA-Z0-9_]{1,})/;
      var regExpMsie5x = /^\s*[object\s+([a-zA-Z0-9_]{1,})/;
      return ((thisConstructor) ? ((regExpDefault.test(thisConstructorString)) ? (regExpDefault.exec(thisConstructorString)[1].toLowerCase()) : ((regExpMsie5x.test(thisConstructorString)) ? (regExpMsie5x.exec(thisConstructorString)[1].toLowerCase()) : ("object"))) : ("object"));
   };
// liefert einen genaueren objekt-typen zurueck als die eingebaute globale funktion "typeof";

*g*
Sind die REGEXP von Dir? Kann das süchtig machen? ;-))

Probleme:
Wofür sind die regExpMsie5x? Mein MSIE5.5 läuft auch mit den regExpDefault genau so wie Mozilla1.3.1.

Einen Fehler hat MSIE5.5 allerdings. IMAGE ist für ihn kein Object im Sinne von JavaScript. Es ist eben ein natives Objekt. Deswegen bringt folgendes den Fehler:
Objekt unterstützt diese Eigenschaft oder Methode nicht.

Klar, getConstructorName() und getObjectType() wurden dem nativen IMAGE-Objekt gar nicht zugewiesen.

myI = new Image();
document.writeln(myI.getConstructorName());
document.writeln(myI.getObjectType());

Mozilla macht das. Allerdings bringt
myI.getConstructorName() == null und
myI.getObjectType() == "objekt".

viele Grüße

Axel