ebody: Private Eigenschaften in statischen Methoden ansprechen

problematische Seite

Hallo,

ich recherchiere gerade u.a. bzgl. private und statische Eigenschaften/Methoden und probiere anhand einer kleinen Klasse verschiedenes aus.

Ich habe eine statische Methode, die eine private Eigenschaft nutzt. Das ist nur ein Schnippsel vom gesamten Code:

run(speed){
 console.log(`VROOOOOOOOOOM! He runs with ${Hero.getSpeed(speed)} km/h`);
}
  
static getSpeed(speed){
 return this.#_power * speed;
}

Das führt zur Fehlermeldung:

Cannot read private member #_power from an object whose class did not declare it

#_power wurde im Constructor der Klasse definiert: this.#_power = 10;

Kann man private Eigenschaften nicht in statischen Methoden verwenden oder wie kann man #_power in der statischen Methode getSpeed() ansprechen?

Gruß ebody

  1. problematische Seite

    Tach!

    Kann man private Eigenschaften nicht in statischen Methoden verwenden oder wie kann man #_power in der statischen Methode getSpeed() ansprechen?

    In einer statischen Methode kann man generell nicht auf Eigenschaften eines Objekts zugreifen, weil kein this existiert. Besser gesagt zeigt dein this auf irgendwas anderes, aber kein Objekt dieser Klasse. Statische Dinge hängen an der Klasse, sind aber von einer Objektinstanz aus quasi wie externe Dinge zu betrachten.

    Man kann eine statische Methode zwar so aufrufen, dass das this auf eine Objektinstanz zeigt, aber das ist nicht Sinn der Sache. Dann kann man auch gleich die Methode als nicht-statisch anlegen.

    dedlfix.

    1. problematische Seite

      Hallo dedlfix,

      ja, man braucht eine valide Objektreferenz und eine statische Methode hat die nicht implizit. Sie muss sie übergeben bekommen. Ob eine statische Methode damit auf eine private Eigenschaft zugreifen kann, dürfte aber von der Spezifikation der jeweiligen Sprache abhängen.

      Im Moment kann ich nicht ausprobieren. Würde dies funktionieren:

      class Hero {
         static getSpeed(hero, speed) {
            return hero.#_power * speed;
         }
      }
      

      Ich frage mich allerdings, ob die Namen sinnvoll sind.
      Geschwindigkeit = Leistung * Geschwindigkeit, klingt seltsam. Entweder ist der Parameter oder die private Eigenschaft schlecht benannt.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. problematische Seite

        Tach!

        Im Moment kann ich nicht ausprobieren. Würde dies funktionieren:

        class Hero {
           static getSpeed(hero, speed) {
              return hero.#_power * speed;
           }
        }
        

        Wenn man es so schreibt und probiert

        class Hero {
            #_power = 2;
            static getSpeed(hero, speed) {
                return hero.#_power * speed;
            }
        }
        
        const hero = new Hero();
        console.log(Hero.getSpeed(hero, 5));
        

        dann bekommt man 10 und keine Fehlermeldung. Aber warum will man solch ein Konstrukt bauen? Was ist der Sinn dahinter, eine Methode statisch zu machen, wenn man sie dann doch mit einer Instanz aufruft, und sie noch explizit übergeben muss?

        Statische Methoden nehme ich, wenn eine Berechnung auszuführen ist, die nur im Kontext der Klasse sinnvoll ist. Die ist üblicherweise dann auch private. Öffentliche statische Methoden kann man im Prinzip auch als herkömmliche Funktion schreiben.

        dedlfix.

        1. problematische Seite

          Lieber dedlfix,

          Öffentliche statische Methoden kann man im Prinzip auch als herkömmliche Funktion schreiben.

          oder sie sind dazu da, Instanzen der Klasse zurück zu geben: Monster.getAll( includeInactive = false );

          Liebe Grüße

          Felix Riesterer

        2. problematische Seite

          Hallo dedlfix,

          Öffentliche statische Methoden kann man im Prinzip auch als herkömmliche Funktion schreiben.

          Im Prinzip schon. Die gewünschte Funktionalität bekommt man in JavaScript immer auch mit normalen Funktionen hin, inklusive statischer privater Elemente. Man baue einfach ein Modul mit den entsprechenden Exporten.

          Die gibt's nicht in jeder Sprache, deswegen kennt OOP die Idee der statischen Klassenelemente.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. problematische Seite

            Tach!

            Öffentliche statische Methoden kann man im Prinzip auch als herkömmliche Funktion schreiben.

            Im Prinzip schon. Die gewünschte Funktionalität bekommt man in JavaScript immer auch mit normalen Funktionen hin, inklusive statischer privater Elemente. Man baue einfach ein Modul mit den entsprechenden Exporten.

            Ich möchte meine Aussage wie folgt verstanden wissen. Man kann schon für seinen Anwendungsfall einen Sinn dahinter sehen, nicht nur eine Funktion zu schreiben, sondern eine statische Methode einer Klasse. Vielleicht, weil man dazu noch konstante Werte braucht oder einen globalen State speichern möchte, und man dazu in der Klasse statische Eigenschaften anlegt. Beispielsweise dass man sie als private anlegt, um damit direkten Zugriff zu verhindern. Aber grundsätzlich sollte man das solchen Anwendungsfällen vorbehalten, die man eigentlich auch mit einer einfachen Funktion und ohne eine Instanz einer Klasse bedienen kann.

            dedlfix.

      2. problematische Seite

        @@Rolf B

        class Hero {
           static getSpeed(hero, speed) {
              return hero.#_power * speed;
           }
        }
        

        Ich frage mich allerdings, ob die Namen sinnvoll sind.

        Eine Methode, die get… heißt und Parameter erwartet, ist wohl nicht sinnvoll, oder?

        😷 LLAP

        --
        „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
        — Joachim Gauck über Impfgegner
        1. problematische Seite

          Hi,

          Eine Methode, die get… heißt und Parameter erwartet, ist wohl nicht sinnvoll, oder?

          Oder!

          getFirstValues(n);

          cu,
          Andreas a/k/a MudGuard

        2. problematische Seite

          Hallo Gunnar,

          Eine Methode, die get… heißt und Parameter erwartet, ist wohl nicht sinnvoll, oder?

          Natürlich nicht.

          <script>
             const fooElement = document.getElementById("foo");
          </script>
          

          Spaß beiseite - dass eine Methode, deren Name mit get beginnt, zwingend ein Property-Getter ist, mag in Java idiomatisch sein, wo es keine getter/setter-Syntax gibt, aber generalisieren würde ich das nicht.

          Und so, wie sie parametriert wird, ist sie vermutlich nicht sinnvoll. Deswegen hatte ich das ja auch in Frage gestellt. Ob ebody hier was "sinnvolles" tut oder nur rumexperimentiert, hat er nicht gesagt; als Experiment mit Sichtbarkeiten kann man ja machen was man will.

          Rolf

          --
          sumpsi - posui - obstruxi