ingo b: objekt-typ abfragen

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");
   }
}

  1. 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

    --
    LeagueEditor JavaScript :: simple Ligaverwaltung auf der Basis von JavaScript || JS Tetris :: für zwischendurch
  2. 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

    1. 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

      --
      LeagueEditor JavaScript :: simple Ligaverwaltung auf der Basis von JavaScript || JS Tetris :: für zwischendurch
      1. 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

        1. 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

          --
          LeagueEditor JavaScript :: simple Ligaverwaltung auf der Basis von JavaScript || JS Tetris :: für zwischendurch