Hallo,
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.
Du könntest die constructor-Eigenschaft der Instanz verwenden. Diese liefert die Constructor-Funktion oder das Constructor-Objekt, wenn es sich um ein direkt eingebundenes Objekt handelt (bsp. IMAGE). Diese beiden Fälle könnte eine function getPrototype(obj) berücksichtigen und die entsprechenden Prototyp-Name herauslesen.
Beispiel:
<script type="text/javascript">
<!--
//Prototyp MyPerson
function MyPerson(name) {
var iName = name;
this.getName = function() {
return iName;
}
this.setName = function(name) {
iName = name;
}
}
//Prototyp MyAnschrift erweitert MyPerson
function MyAnschrift(name, ort) {
var iOrt = ort;
this.prototype = MyPerson;
this.prototype(name);
this.getAnschrift = function() {
return this.getName() + " " + iOrt;
}
this.setAnschrift = function(name, ort) {
this.setName(name);
iOrt = ort;
}
}
//Prototypen beliebiger Objekte ermitteln
function getPrototype(obj) {
var iPrototype = undefined;
if (obj.constructor) {
if (obj.constructor.toString().indexOf("function") >=0 && obj.constructor.toString().indexOf("function") <=1 && obj.constructor.toString().indexOf("(") > 9) {
iPrototype = obj.constructor.toString().substring(9, obj.constructor.toString().indexOf("("));
} else if (obj.constructor.toString().indexOf("[") == 0) {
iPrototype = obj.constructor.toString();
}
}
return iPrototype;
}
var myP = new MyPerson("Müller");
document.writeln(myP.getName());
myP.setName("Maier");
document.writeln(myP.getName());
document.writeln("<br>");
var myA = new MyAnschrift("Müller", "Cottbus");
document.writeln(myA.getAnschrift());
myA.setAnschrift("Maier", "Köln");
document.writeln(myA.getAnschrift());
document.writeln("<br>");
document.writeln("<br>");
document.writeln("Prototypen ermitteln");
document.writeln("<br>");
document.writeln(getPrototype(myP));
document.writeln("<br>");
document.writeln(getPrototype(myA));
document.writeln("erweitert");
document.writeln(getPrototype(myA.prototype));
document.writeln("<br>");
myI = new Image();
document.writeln(getPrototype(myI));
document.writeln("<br>");
myArr = new Array(5);
document.writeln(getPrototype(myArr));
document.writeln("<br>");
myFunc = function() {return};
document.writeln(getPrototype(myFunc));
document.writeln("<br>");
function MyImage() {
this.prototype = new Image();
}
myMyI = new MyImage();
document.writeln(getPrototype(myMyI));
document.writeln("erweitert");
document.writeln(getPrototype(myMyI.prototype));
document.writeln("<br>");
function MyArray() {
this.prototype = new Array();
}
myMyArr = new MyArray();
document.writeln(getPrototype(myMyArr));
document.writeln("erweitert");
document.writeln(getPrototype(myMyArr.prototype));
document.writeln("<br>");
//-->
</script>
Zu testen wäre, ob wirklich nur die beiden behandelten Fälle existieren und ob die DOM-fähigen Browser alle gleiche Werte für obj.constructor.toString() liefern. Getestet habe ich MSIE5.5 und Mozilla1.3.1. Hier gab es schon Unterschiede. MSIE liefert bei Funktionen als Constructor obj.constructor.toString().indexOf("function") == 0, Mozilla liefert obj.constructor.toString().indexOf("function") == 1.
viele Grüße
Axel