objekt-typ abfragen
ingo b
- javascript
0 derletztekick2 molily
0 derletztekick2 molily
Hallo,
ich hätte noch die Frage, ob man irgendwie den Namen oder Art eines Objekts abfragen kann.
Folgende Situation:
function chef(sName) {
this.name = sName;
}
function mitarbeiter(sName) {
this.name = sName;
}
function arbeitet_fuer(oChef,oMitarbeiter) {
//Ein Problem tritt nun auf, wenn die Argumentreihenfolge
//nicht eingehalten wurde. Daher hätte ich gern sowas:
if (typeof oChef != "chef") {alert("Falsche Argumentreihenfolge");}
}
Das war jetzt nur ein konstruiertes Beispiel, das man auch anders lösen könnte, aber mein Beispiel wäre ein wenig zu lang.
Ach so, mein Ansatz wäre folgender:
function chef(sName) {
this.name = sName;
this.getType = function(){return "chef"}
}
und dann
if (typeof oChef = "object") {
try {
if (oChef.getType() != "chef")
alert("Falsche Argumentreihenfolge");
} catch(e) {
alert("Falscher Objekttyp");
}
}
Hallo ingo b,
ich hätte noch die Frage, ob man irgendwie den Namen oder Art eines Objekts abfragen kann.
Dein Ansatz aufgegriffen habe ich das mal erstellt:
function mitarbeiter(sName) {
this.name = sName;
}
function chef(sName) {
this.name = sName;
this.isChef = function(){return true;};
}
var boss = new chef("Müller");
var knecht = new mitarbeiter("Meier");
function arbeitet_fuer(oChef,oMitarbeiter) {
if(typeof oChef == "object" && typeof oMitarbeiter == "object"){
try{
if (oChef.isChef())
window.alert("Koorekte Eingabe");
}
catch(e) {
try {
if (oMitarbeiter.isChef())
return arbeitet_fuer(oMitarbeiter, oChef);
}
catch(er) {
window.alert("Hmm, alles nicht so das wahre...");
}
}
}
}
arbeitet_fuer(boss,knecht);
arbeitet_fuer(knecht,boss);
Mit freundlichem Gruß
Micha
Hallo,
Sinnigerweise sollte arbeitet_fuer eine Methode des mitarbeiter-Objektes sein, die dann einen Parameter bekommt. Aber gut, was deine Frage angeht: die Eigenschaft constructor verweist auf die Konstruktorfunktion, mit der das Objekt erzeugt wurde:
function chef (name) {
this.name = name;
}
function mitarbeiter (name) {
this.name = name;
}
function arbeitet_fuer (a, b) {
var arbeitgeber = a, arbeitnehmer = b;
if (a.constructor == mitarbeiter) {
alert("Falsche Argumentreihenfolge!");
arbeitgeber = b;
arbeitnehmer = a;
}
alert("arbeitgeber: " + arbeitgeber.name + "\narbeitnehmer: " + arbeitnehmer.name);
}
var c = new chef("Boss");
var m = new mitarbeiter("Knecht");
arbeitet_fuer(c, m);
arbeitet_fuer(m, c);
Mathias
Hallo molily,
nach so etwas habe ich zunächst auch gesucht mit einer for-in Schleife. Warum wird dort diese Eigenschaft:
a.constructor == mitarbeiter
nicht gelistet?
Mit freundlichem Gruß
Micha
Hallo,
nach so etwas habe ich zunächst auch gesucht mit einer for-in Schleife. Warum wird dort diese Eigenschaft:
a.constructor
nicht gelistet?
Weil das in ECMAScript, zum zuständigen Standard, so definiert ist (keine zufriedenstellende Antwort, ich weiß).
Die constructor-Eigenschaft hat den DontEnum-Flag (»The property is not to be enumerated by a for-in enumeration«).
http://bclary.com/log/2004/11/07/#a-13.2
http://bclary.com/log/2004/11/07/#a-8.6.1
Das ist im Allgemeinen ein Vorteil, denn die constructor-Eigenschaft will man nicht bekommen, wenn man z.B. alle Member eines (gezielt angelegten) Objektes auslesen will.
Mathias
Hallo Mathias,
a.constructor
Die constructor-Eigenschaft hat den DontEnum-Flag (»The property is not to be enumerated by a for-in enumeration«).
Danke für die Erklärung!
Mit freundlichem Gruß
Micha