Private Eigenschaften in statischen Methoden ansprechen
ebody
- javascript
0 dedlfix0 Rolf B0 dedlfix0 Felix Riesterer0 Rolf B0 dedlfix
0 Gunnar Bittersmann
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
Tach!
Kann man private Eigenschaften nicht in statischen Methoden verwenden oder wie kann man
#_power
in der statischen MethodegetSpeed()
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.
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
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.
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
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
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.
@@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
Hi,
Eine Methode, die
get…
heißt und Parameter erwartet, ist wohl nicht sinnvoll, oder?
Oder!
getFirstValues(n);
cu,
Andreas a/k/a MudGuard
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