Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Abgeleitete Klassen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.8k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    891

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

Abgeleitete Klassen

Geplant Angeheftet Gesperrt Verschoben JavaScript
16 Beiträge 5 Kommentatoren 901 Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • W Offline
    W Offline
    WolfgangFB
    schrieb am zuletzt editiert von
    #1

    Folgendes JS

    class BasisFunktionsKlasse{
        constructor(){
            const Pfad = "Hallo";
            if (!BasisFunktionsKlasse.instance){
                BasisFunktionsKlasse.instance = this;
                this.Logfunktion = function(Text){console.log("Exportierter Text: " + Text + " " + Pfad)};
                this.Logfunktion("BasisFunktionsKlasse erzeugt 1");
                this.Datenpunkte = 1;
            }
            return BasisFunktionsKlasse.instance;
        }
    }
    
    class AbgeleiteteUnterklasse1 extends BasisFunktionsKlasse{
        Bla1(){
            console.log("Bla1");
        }
        constructor(){
            super(); // Aufruf des Constructors der Basisfunktionsklasse
            this.Logfunktion("Abgeleitete UnterKlasse1 erzeugt " + this.Datenpunkte);
            this.Bla1();
        }
    
    }
    class AbgeleiteteUnterklasse2 extends BasisFunktionsKlasse{
        Bla2(){
            console.log("Bla2");
        }
        constructor(){
            super(); // Aufruf des Constructors der Basisfunktionsklasse
            this.Logfunktion("Abgeleitete UnterKlasse2 erzeugt " + this.Datenpunkte);
            this.Bla2();
        }
    
    }
    
    let AbgeleiteteKlasse2 = new AbgeleiteteUnterklasse2();
    let AbgeleiteteKlasse1 = new AbgeleiteteUnterklasse1();
    
    

    Je nachdem in welcher Reihenfolge ich die Abgeleiteten Klassen erzeuge kommt die Fehlermeldung "Bla1" bzw. "Bla2" is not a function. Jede abgeleitete Klasse für sich alleine geht.
    Wo liegt mein Fehler?

    arteckA MartinPM haus-automatisierungH 3 Antworten Letzte Antwort
    0
    • W WolfgangFB

      Folgendes JS

      class BasisFunktionsKlasse{
          constructor(){
              const Pfad = "Hallo";
              if (!BasisFunktionsKlasse.instance){
                  BasisFunktionsKlasse.instance = this;
                  this.Logfunktion = function(Text){console.log("Exportierter Text: " + Text + " " + Pfad)};
                  this.Logfunktion("BasisFunktionsKlasse erzeugt 1");
                  this.Datenpunkte = 1;
              }
              return BasisFunktionsKlasse.instance;
          }
      }
      
      class AbgeleiteteUnterklasse1 extends BasisFunktionsKlasse{
          Bla1(){
              console.log("Bla1");
          }
          constructor(){
              super(); // Aufruf des Constructors der Basisfunktionsklasse
              this.Logfunktion("Abgeleitete UnterKlasse1 erzeugt " + this.Datenpunkte);
              this.Bla1();
          }
      
      }
      class AbgeleiteteUnterklasse2 extends BasisFunktionsKlasse{
          Bla2(){
              console.log("Bla2");
          }
          constructor(){
              super(); // Aufruf des Constructors der Basisfunktionsklasse
              this.Logfunktion("Abgeleitete UnterKlasse2 erzeugt " + this.Datenpunkte);
              this.Bla2();
          }
      
      }
      
      let AbgeleiteteKlasse2 = new AbgeleiteteUnterklasse2();
      let AbgeleiteteKlasse1 = new AbgeleiteteUnterklasse1();
      
      

      Je nachdem in welcher Reihenfolge ich die Abgeleiteten Klassen erzeuge kommt die Fehlermeldung "Bla1" bzw. "Bla2" is not a function. Jede abgeleitete Klasse für sich alleine geht.
      Wo liegt mein Fehler?

      arteckA Offline
      arteckA Offline
      arteck
      Developer Most Active
      schrieb am zuletzt editiert von
      #2

      @wolfgangfb kennste

      https://www.iobroker.net/docu/index-43.htm?page_id=5385&lang=de#Funktionen

      zigbee hab ich, zwave auch, nuc's genauso und HA auch

      W 1 Antwort Letzte Antwort
      0
      • W WolfgangFB

        Folgendes JS

        class BasisFunktionsKlasse{
            constructor(){
                const Pfad = "Hallo";
                if (!BasisFunktionsKlasse.instance){
                    BasisFunktionsKlasse.instance = this;
                    this.Logfunktion = function(Text){console.log("Exportierter Text: " + Text + " " + Pfad)};
                    this.Logfunktion("BasisFunktionsKlasse erzeugt 1");
                    this.Datenpunkte = 1;
                }
                return BasisFunktionsKlasse.instance;
            }
        }
        
        class AbgeleiteteUnterklasse1 extends BasisFunktionsKlasse{
            Bla1(){
                console.log("Bla1");
            }
            constructor(){
                super(); // Aufruf des Constructors der Basisfunktionsklasse
                this.Logfunktion("Abgeleitete UnterKlasse1 erzeugt " + this.Datenpunkte);
                this.Bla1();
            }
        
        }
        class AbgeleiteteUnterklasse2 extends BasisFunktionsKlasse{
            Bla2(){
                console.log("Bla2");
            }
            constructor(){
                super(); // Aufruf des Constructors der Basisfunktionsklasse
                this.Logfunktion("Abgeleitete UnterKlasse2 erzeugt " + this.Datenpunkte);
                this.Bla2();
            }
        
        }
        
        let AbgeleiteteKlasse2 = new AbgeleiteteUnterklasse2();
        let AbgeleiteteKlasse1 = new AbgeleiteteUnterklasse1();
        
        

        Je nachdem in welcher Reihenfolge ich die Abgeleiteten Klassen erzeuge kommt die Fehlermeldung "Bla1" bzw. "Bla2" is not a function. Jede abgeleitete Klasse für sich alleine geht.
        Wo liegt mein Fehler?

        MartinPM Online
        MartinPM Online
        MartinP
        schrieb am zuletzt editiert von
        #3

        @wolfgangfb In allen Beispielen, die ich gesehen habe, wird in der Klassendefinition immer der Konstruktor zuerst definiert, und dann folgen weitere Methoden - stell doch mal versuchsweise die Reihenfolge entsprechend um ...

        Intel(R) Celeron(R) CPU N3000 @ 1.04GHz 8G RAM 480G SSD
        Virtualization : unprivileged lxc container (debian 12 on Proxmox 8.4.14)
        Linux pve 6.8.12-16-pve
        6 GByte RAM für den Container
        Fritzbox 6591 FW 8.03 (Vodafone Leih-Box)
        Remote-Access über Wireguard der Fritzbox

        1 Antwort Letzte Antwort
        0
        • W WolfgangFB

          Folgendes JS

          class BasisFunktionsKlasse{
              constructor(){
                  const Pfad = "Hallo";
                  if (!BasisFunktionsKlasse.instance){
                      BasisFunktionsKlasse.instance = this;
                      this.Logfunktion = function(Text){console.log("Exportierter Text: " + Text + " " + Pfad)};
                      this.Logfunktion("BasisFunktionsKlasse erzeugt 1");
                      this.Datenpunkte = 1;
                  }
                  return BasisFunktionsKlasse.instance;
              }
          }
          
          class AbgeleiteteUnterklasse1 extends BasisFunktionsKlasse{
              Bla1(){
                  console.log("Bla1");
              }
              constructor(){
                  super(); // Aufruf des Constructors der Basisfunktionsklasse
                  this.Logfunktion("Abgeleitete UnterKlasse1 erzeugt " + this.Datenpunkte);
                  this.Bla1();
              }
          
          }
          class AbgeleiteteUnterklasse2 extends BasisFunktionsKlasse{
              Bla2(){
                  console.log("Bla2");
              }
              constructor(){
                  super(); // Aufruf des Constructors der Basisfunktionsklasse
                  this.Logfunktion("Abgeleitete UnterKlasse2 erzeugt " + this.Datenpunkte);
                  this.Bla2();
              }
          
          }
          
          let AbgeleiteteKlasse2 = new AbgeleiteteUnterklasse2();
          let AbgeleiteteKlasse1 = new AbgeleiteteUnterklasse1();
          
          

          Je nachdem in welcher Reihenfolge ich die Abgeleiteten Klassen erzeuge kommt die Fehlermeldung "Bla1" bzw. "Bla2" is not a function. Jede abgeleitete Klasse für sich alleine geht.
          Wo liegt mein Fehler?

          haus-automatisierungH Online
          haus-automatisierungH Online
          haus-automatisierung
          Developer Most Active
          schrieb am zuletzt editiert von
          #4

          @wolfgangfb sagte in Abgeleitete Klassen:

          Je nachdem in welcher Reihenfolge ich die Abgeleiteten Klassen erzeuge kommt die Fehlermeldung "Bla1" bzw. "Bla2" is not a function. Jede abgeleitete Klasse für sich alleine geht.

          Logisch, weil Du ja oben eine Art Singleton-Pattern gebaut hast. Was soll der Teil mit der Prüfung auf .instance?

          🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
          🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
          📚 Meine inoffizielle ioBroker Dokumentation

          haus-automatisierungH W 2 Antworten Letzte Antwort
          0
          • haus-automatisierungH haus-automatisierung

            @wolfgangfb sagte in Abgeleitete Klassen:

            Je nachdem in welcher Reihenfolge ich die Abgeleiteten Klassen erzeuge kommt die Fehlermeldung "Bla1" bzw. "Bla2" is not a function. Jede abgeleitete Klasse für sich alleine geht.

            Logisch, weil Du ja oben eine Art Singleton-Pattern gebaut hast. Was soll der Teil mit der Prüfung auf .instance?

            haus-automatisierungH Online
            haus-automatisierungH Online
            haus-automatisierung
            Developer Most Active
            schrieb am zuletzt editiert von
            #5

            Eher so:

            class BasisFunktionsKlasse{
                constructor(){
                    this.pfad = "Hallo";
                    this.Logfunktion("BasisFunktionsKlasse erzeugt 1");
                    this.Datenpunkte = 1;
                }
                Logfunktion(text) {
                    console.log(`Exportierter Text: ${text} ${this.pfad}`)};
                }
            }
             
            class AbgeleiteteUnterklasse1 extends BasisFunktionsKlasse{
                Bla1(){
                    console.log("Bla1");
                }
                constructor() {
                    super(); // Aufruf des Constructors der Basisfunktionsklasse
                     this.Logfunktion("Abgeleitete UnterKlasse1 erzeugt " + this.Datenpunkte);
                     this.Bla1();
                 }
             }
             class AbgeleiteteUnterklasse2 extends BasisFunktionsKlasse{
                 Bla2(){
                     console.log("Bla2");
                 }
                 constructor() {
                     super(); // Aufruf des Constructors der Basisfunktionsklasse
                     this.Logfunktion("Abgeleitete UnterKlasse2 erzeugt " + this.Datenpunkte);
                     this.Bla2();
                 }
             }
              
             const AbgeleiteteKlasse2 = new AbgeleiteteUnterklasse2();
             const AbgeleiteteKlasse1 = new AbgeleiteteUnterklasse1();
            

            🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
            🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
            📚 Meine inoffizielle ioBroker Dokumentation

            W 1 Antwort Letzte Antwort
            0
            • arteckA arteck

              @wolfgangfb kennste

              https://www.iobroker.net/docu/index-43.htm?page_id=5385&lang=de#Funktionen

              W Offline
              W Offline
              WolfgangFB
              schrieb am zuletzt editiert von
              #6

              @arteck sagte in Abgeleitete Klassen:

              @wolfgangfb kennste

              https://www.iobroker.net/docu/index-43.htm?page_id=5385&lang=de#Funktionen

              Ich kenne Funktionen, ich will aber das Singelton Design Prinzip besser verstehen. Mir ist schon klar dass ich in meinem Beispiel mit Kanonen auf Spatzen schieße.

              1 Antwort Letzte Antwort
              0
              • haus-automatisierungH haus-automatisierung

                @wolfgangfb sagte in Abgeleitete Klassen:

                Je nachdem in welcher Reihenfolge ich die Abgeleiteten Klassen erzeuge kommt die Fehlermeldung "Bla1" bzw. "Bla2" is not a function. Jede abgeleitete Klasse für sich alleine geht.

                Logisch, weil Du ja oben eine Art Singleton-Pattern gebaut hast. Was soll der Teil mit der Prüfung auf .instance?

                W Offline
                W Offline
                WolfgangFB
                schrieb am zuletzt editiert von
                #7

                @haus-automatisierung sagte in Abgeleitete Klassen:

                @wolfgangfb sagte in Abgeleitete Klassen:

                Je nachdem in welcher Reihenfolge ich die Abgeleiteten Klassen erzeuge kommt die Fehlermeldung "Bla1" bzw. "Bla2" is not a function. Jede abgeleitete Klasse für sich alleine geht.

                Logisch, weil Du ja oben eine Art Singleton-Pattern gebaut hast. Was soll der Teil mit der Prüfung auf .instance?

                Ähm, das ist meiner Meinung nach genau die Singleton Implementierung. Wenn noch keine Instanz erzeugt ist wird eine erzeugt, ansonsten wir die Einzige bisher verwendet Instanz verwendet. So habe ich bisher Singleton verstanden.

                1 Antwort Letzte Antwort
                0
                • haus-automatisierungH haus-automatisierung

                  Eher so:

                  class BasisFunktionsKlasse{
                      constructor(){
                          this.pfad = "Hallo";
                          this.Logfunktion("BasisFunktionsKlasse erzeugt 1");
                          this.Datenpunkte = 1;
                      }
                      Logfunktion(text) {
                          console.log(`Exportierter Text: ${text} ${this.pfad}`)};
                      }
                  }
                   
                  class AbgeleiteteUnterklasse1 extends BasisFunktionsKlasse{
                      Bla1(){
                          console.log("Bla1");
                      }
                      constructor() {
                          super(); // Aufruf des Constructors der Basisfunktionsklasse
                           this.Logfunktion("Abgeleitete UnterKlasse1 erzeugt " + this.Datenpunkte);
                           this.Bla1();
                       }
                   }
                   class AbgeleiteteUnterklasse2 extends BasisFunktionsKlasse{
                       Bla2(){
                           console.log("Bla2");
                       }
                       constructor() {
                           super(); // Aufruf des Constructors der Basisfunktionsklasse
                           this.Logfunktion("Abgeleitete UnterKlasse2 erzeugt " + this.Datenpunkte);
                           this.Bla2();
                       }
                   }
                    
                   const AbgeleiteteKlasse2 = new AbgeleiteteUnterklasse2();
                   const AbgeleiteteKlasse1 = new AbgeleiteteUnterklasse1();
                  
                  W Offline
                  W Offline
                  WolfgangFB
                  schrieb am zuletzt editiert von
                  #8

                  @haus-automatisierung sagte in Abgeleitete Klassen:

                  Eher so:

                  class BasisFunktionsKlasse{
                      constructor(){
                          this.pfad = "Hallo";
                          this.Logfunktion("BasisFunktionsKlasse erzeugt 1");
                          this.Datenpunkte = 1;
                      }
                      Logfunktion(text) {
                          console.log(`Exportierter Text: ${text} ${this.pfad}`)};
                      }
                  }
                   
                  class AbgeleiteteUnterklasse1 extends BasisFunktionsKlasse{
                      Bla1(){
                          console.log("Bla1");
                      }
                      constructor() {
                          super(); // Aufruf des Constructors der Basisfunktionsklasse
                           this.Logfunktion("Abgeleitete UnterKlasse1 erzeugt " + this.Datenpunkte);
                           this.Bla1();
                       }
                   }
                   class AbgeleiteteUnterklasse2 extends BasisFunktionsKlasse{
                       Bla2(){
                           console.log("Bla2");
                       }
                       constructor() {
                           super(); // Aufruf des Constructors der Basisfunktionsklasse
                           this.Logfunktion("Abgeleitete UnterKlasse2 erzeugt " + this.Datenpunkte);
                           this.Bla2();
                       }
                   }
                    
                   const AbgeleiteteKlasse2 = new AbgeleiteteUnterklasse2();
                   const AbgeleiteteKlasse1 = new AbgeleiteteUnterklasse1();
                  

                  Das ist aber nicht Siongleton, jede Unterklasse erhält hier eine eigene Instanz der Basisklasse. Lass mal Unterklasse2 den Wert von Datenpunnt ändern, Unterklasse1 bekommt davon nichts mit.

                  haus-automatisierungH 1 Antwort Letzte Antwort
                  0
                  • W WolfgangFB

                    @haus-automatisierung sagte in Abgeleitete Klassen:

                    Eher so:

                    class BasisFunktionsKlasse{
                        constructor(){
                            this.pfad = "Hallo";
                            this.Logfunktion("BasisFunktionsKlasse erzeugt 1");
                            this.Datenpunkte = 1;
                        }
                        Logfunktion(text) {
                            console.log(`Exportierter Text: ${text} ${this.pfad}`)};
                        }
                    }
                     
                    class AbgeleiteteUnterklasse1 extends BasisFunktionsKlasse{
                        Bla1(){
                            console.log("Bla1");
                        }
                        constructor() {
                            super(); // Aufruf des Constructors der Basisfunktionsklasse
                             this.Logfunktion("Abgeleitete UnterKlasse1 erzeugt " + this.Datenpunkte);
                             this.Bla1();
                         }
                     }
                     class AbgeleiteteUnterklasse2 extends BasisFunktionsKlasse{
                         Bla2(){
                             console.log("Bla2");
                         }
                         constructor() {
                             super(); // Aufruf des Constructors der Basisfunktionsklasse
                             this.Logfunktion("Abgeleitete UnterKlasse2 erzeugt " + this.Datenpunkte);
                             this.Bla2();
                         }
                     }
                      
                     const AbgeleiteteKlasse2 = new AbgeleiteteUnterklasse2();
                     const AbgeleiteteKlasse1 = new AbgeleiteteUnterklasse1();
                    

                    Das ist aber nicht Siongleton, jede Unterklasse erhält hier eine eigene Instanz der Basisklasse. Lass mal Unterklasse2 den Wert von Datenpunnt ändern, Unterklasse1 bekommt davon nichts mit.

                    haus-automatisierungH Online
                    haus-automatisierungH Online
                    haus-automatisierung
                    Developer Most Active
                    schrieb am zuletzt editiert von haus-automatisierung
                    #9

                    @wolfgangfb Das ist ja der Sinn von Klassen?! Definiere nochmal deine Anforderung genauer.

                    Singleton bedeutet, dass es von einer Klasse nur ein Objekt geben darf und man nicht beliebig viele erzeugen kann. Mehr nicht. Mit Vererbung hat das erstmal nichts zu tun.

                    Dein Problem ist BasisFunktionsKlasse.instance
                    Das ist global und nicht pro Objekt/Klasse. Daher entscheidet die Reihenfolge, ob darin ein Objekt der ersten oder zweiten Klasse gespeichert wurde. Dementsprechend gibt es manche Funktionen (der anderen Klasse) dann nicht.

                    Wenn Du möchtest dass jede abgeleitete Klasse ein Singleton ist, dann ist das mit JavaScript nicht so einfach abbildbar. In anderen Programmiersprachen gibt es da elegante Möglichkeiten.

                    Such mal nach singleton inheritance

                    🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                    🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                    📚 Meine inoffizielle ioBroker Dokumentation

                    W 1 Antwort Letzte Antwort
                    0
                    • haus-automatisierungH haus-automatisierung

                      @wolfgangfb Das ist ja der Sinn von Klassen?! Definiere nochmal deine Anforderung genauer.

                      Singleton bedeutet, dass es von einer Klasse nur ein Objekt geben darf und man nicht beliebig viele erzeugen kann. Mehr nicht. Mit Vererbung hat das erstmal nichts zu tun.

                      Dein Problem ist BasisFunktionsKlasse.instance
                      Das ist global und nicht pro Objekt/Klasse. Daher entscheidet die Reihenfolge, ob darin ein Objekt der ersten oder zweiten Klasse gespeichert wurde. Dementsprechend gibt es manche Funktionen (der anderen Klasse) dann nicht.

                      Wenn Du möchtest dass jede abgeleitete Klasse ein Singleton ist, dann ist das mit JavaScript nicht so einfach abbildbar. In anderen Programmiersprachen gibt es da elegante Möglichkeiten.

                      Such mal nach singleton inheritance

                      W Offline
                      W Offline
                      WolfgangFB
                      schrieb am zuletzt editiert von
                      #10

                      @haus-automatisierung
                      Für mich bedeutet Singleton, dass es von einer Klasse nur eine Instanz geben darf (so finde ich das auch überall in den Beschreibungen), das bedeutet aber nicht, dass nicht mehrere Objekte auf diese eine Instnz zugreifen können (das ist ja genau der Sinn des Singleton Design Patterns, nämlich dass sich mehrere Objekte die gleichen Resourcen teilen). Mein Anliegen war zu lernen (mir geht es hier nur ums lernen) wie das ist, wenn eine Klasse von einer Singleton Klasse erbt und dieser Mutterklasse weitere Methoden hinzufügt ob diese zusätzlichen Methoden auch anderen Klassen, die von dieser Klasse erben, verfügbar sind. Das ist wohl nicht der Fall. Was ich immer noch nicht verstehe ist, warum Kindklassen mal eine Funktion hinzufügen können und mal nicht.
                      Der Ansatz über Klasse.instance ist laut Internet neben der Static Methode wohl ein üblicher Ansatz in JS eine Singleton Instanz zu erzeugen. Mir ist bewusst, dass es in JS keine 100%ige Singleton Variante einer Klasse wie z.B. in Java geben kann. Deswegen mein "Experiment" die Grenzen des Singleton Designs in Javascript zu verstehen.

                      haus-automatisierungH MartinPM 2 Antworten Letzte Antwort
                      0
                      • W WolfgangFB

                        @haus-automatisierung
                        Für mich bedeutet Singleton, dass es von einer Klasse nur eine Instanz geben darf (so finde ich das auch überall in den Beschreibungen), das bedeutet aber nicht, dass nicht mehrere Objekte auf diese eine Instnz zugreifen können (das ist ja genau der Sinn des Singleton Design Patterns, nämlich dass sich mehrere Objekte die gleichen Resourcen teilen). Mein Anliegen war zu lernen (mir geht es hier nur ums lernen) wie das ist, wenn eine Klasse von einer Singleton Klasse erbt und dieser Mutterklasse weitere Methoden hinzufügt ob diese zusätzlichen Methoden auch anderen Klassen, die von dieser Klasse erben, verfügbar sind. Das ist wohl nicht der Fall. Was ich immer noch nicht verstehe ist, warum Kindklassen mal eine Funktion hinzufügen können und mal nicht.
                        Der Ansatz über Klasse.instance ist laut Internet neben der Static Methode wohl ein üblicher Ansatz in JS eine Singleton Instanz zu erzeugen. Mir ist bewusst, dass es in JS keine 100%ige Singleton Variante einer Klasse wie z.B. in Java geben kann. Deswegen mein "Experiment" die Grenzen des Singleton Designs in Javascript zu verstehen.

                        haus-automatisierungH Online
                        haus-automatisierungH Online
                        haus-automatisierung
                        Developer Most Active
                        schrieb am zuletzt editiert von
                        #11

                        @wolfgangfb Das habe ich doch oben versucht zu erklären. Du speicherst eine Instanz/ein Objekt in die Eigenschaft .instance.

                        Und da kann nur ein Objekt enthalten sein. Je nachdem was Du zuerst aufrufst, ist das entweder ein Objekt der ersten oder der zweiten Klasse. Das ist vom Konzept einfach so nicht lösbar wie Du dir das vorstellst. Du müsstest das Singleton Pattern also im Construktor von jeder abgeleiteten Klasse abbilden.

                        Dann kann es von jeder dieser Klassen nur ein Objekt geben. Aber da sehe ich den Mehrwert gegenüber einer Funktionssammlung (ohne Klasse) nicht. Daher die Frage nach dem konkreten Anwendungsfall und was Du vor hast

                        🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                        🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                        📚 Meine inoffizielle ioBroker Dokumentation

                        W 1 Antwort Letzte Antwort
                        1
                        • haus-automatisierungH haus-automatisierung

                          @wolfgangfb Das habe ich doch oben versucht zu erklären. Du speicherst eine Instanz/ein Objekt in die Eigenschaft .instance.

                          Und da kann nur ein Objekt enthalten sein. Je nachdem was Du zuerst aufrufst, ist das entweder ein Objekt der ersten oder der zweiten Klasse. Das ist vom Konzept einfach so nicht lösbar wie Du dir das vorstellst. Du müsstest das Singleton Pattern also im Construktor von jeder abgeleiteten Klasse abbilden.

                          Dann kann es von jeder dieser Klassen nur ein Objekt geben. Aber da sehe ich den Mehrwert gegenüber einer Funktionssammlung (ohne Klasse) nicht. Daher die Frage nach dem konkreten Anwendungsfall und was Du vor hast

                          W Offline
                          W Offline
                          WolfgangFB
                          schrieb am zuletzt editiert von
                          #12

                          @haus-automatisierung
                          Danke erstmal für die Erklärungen. Wie Du ja schon bemerkt hast habe ich noch ein paar Verständnisprobleme. Mein Gedanke war der: Wenn eine Klasse Singleton ist, sprich bei der Erzeugung sichergestellt ist, dass es nur eine Instnaz davon gibt, und eine andere Klasse von dieser Klasse erbt, dass die Unterklassen die Methoden von der Basisklassen erben und weil es von der Basisklasse ja nur eine Instanz gibt alle Unterklassen auf die gleiche Instanz der Basisklasse zugreifen. Dann hätte ich erwartet, dass die Unterklassen zusätzliche Methoden erzeugen können und meine Frage war eben an der Stelle, ob diese zusätzlichen Methoden an die Basisklasse (von der es ja nur eine Instanz gibt) angefügt werden (dann hätte nach meinem Verständnis jede abgeleitete Klasseninstanz auch diese Methoden) oder ob diese zusätzlichen Methoden auf die abgeleitete Klasse beschränkt bleiben (dann verstehe ich nicht, warum nicht 2 abgeleitete Klassen 2 verschiedene zusätzliche Methoden haben dürfen. Einen konkreten Anwendungsfall habe ich nicht, mir geht es erst mal darum das ganze zu verstehen.

                          haus-automatisierungH 1 Antwort Letzte Antwort
                          0
                          • W WolfgangFB

                            @haus-automatisierung
                            Danke erstmal für die Erklärungen. Wie Du ja schon bemerkt hast habe ich noch ein paar Verständnisprobleme. Mein Gedanke war der: Wenn eine Klasse Singleton ist, sprich bei der Erzeugung sichergestellt ist, dass es nur eine Instnaz davon gibt, und eine andere Klasse von dieser Klasse erbt, dass die Unterklassen die Methoden von der Basisklassen erben und weil es von der Basisklasse ja nur eine Instanz gibt alle Unterklassen auf die gleiche Instanz der Basisklasse zugreifen. Dann hätte ich erwartet, dass die Unterklassen zusätzliche Methoden erzeugen können und meine Frage war eben an der Stelle, ob diese zusätzlichen Methoden an die Basisklasse (von der es ja nur eine Instanz gibt) angefügt werden (dann hätte nach meinem Verständnis jede abgeleitete Klasseninstanz auch diese Methoden) oder ob diese zusätzlichen Methoden auf die abgeleitete Klasse beschränkt bleiben (dann verstehe ich nicht, warum nicht 2 abgeleitete Klassen 2 verschiedene zusätzliche Methoden haben dürfen. Einen konkreten Anwendungsfall habe ich nicht, mir geht es erst mal darum das ganze zu verstehen.

                            haus-automatisierungH Online
                            haus-automatisierungH Online
                            haus-automatisierung
                            Developer Most Active
                            schrieb am zuletzt editiert von
                            #13

                            @wolfgangfb sagte in Abgeleitete Klassen:

                            @haus-automatisierung
                            Danke erstmal für die Erklärungen. Wie Du ja schon bemerkt hast habe ich noch ein paar Verständnisprobleme. Mein Gedanke war der: Wenn eine Klasse Singleton ist, sprich bei der Erzeugung sichergestellt ist, dass es nur eine Instnaz davon gibt, und eine andere Klasse von dieser Klasse erbt, dass die Unterklassen die Methoden von der Basisklassen erben

                            Das ist ja auch alles richtig. Aber Du machst ja deutlich mehr. Die Frage ist ja: Singleton von was? Von der Basisklasse? Geht.

                            Aber wenn nun eine weitere Klasse von dieser erbt: Was ist der gewünschte Effekt? Dass es nur je eine Instanz von der Basisklasse + nur eine Instanz von der zweiten Klasse geben darf? Da fängt es ja schon an.

                            Deswegen kann man in anderen Programmiersprachen den Constructor private setzen oder eine Klasse als final definieren, damit man damit nicht machen kann, was man möchte.

                            So wie Du es gerade machst ist es jedenfalls total falsch, weil der Constructor der anderen Klasse ja ggf ein Objekt einer ganz anderen Klasse zurückgibt. Und daher auch dein Problem.

                            Lies dich mal in Polymorphie ein. In JavaScript sind die Möglichkeiten da etwas eingeschränkt. TypeScript kann da schon mehr und kennt auch mehr Schlüsselwörter.

                            🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                            🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                            📚 Meine inoffizielle ioBroker Dokumentation

                            1 Antwort Letzte Antwort
                            0
                            • W WolfgangFB

                              @haus-automatisierung
                              Für mich bedeutet Singleton, dass es von einer Klasse nur eine Instanz geben darf (so finde ich das auch überall in den Beschreibungen), das bedeutet aber nicht, dass nicht mehrere Objekte auf diese eine Instnz zugreifen können (das ist ja genau der Sinn des Singleton Design Patterns, nämlich dass sich mehrere Objekte die gleichen Resourcen teilen). Mein Anliegen war zu lernen (mir geht es hier nur ums lernen) wie das ist, wenn eine Klasse von einer Singleton Klasse erbt und dieser Mutterklasse weitere Methoden hinzufügt ob diese zusätzlichen Methoden auch anderen Klassen, die von dieser Klasse erben, verfügbar sind. Das ist wohl nicht der Fall. Was ich immer noch nicht verstehe ist, warum Kindklassen mal eine Funktion hinzufügen können und mal nicht.
                              Der Ansatz über Klasse.instance ist laut Internet neben der Static Methode wohl ein üblicher Ansatz in JS eine Singleton Instanz zu erzeugen. Mir ist bewusst, dass es in JS keine 100%ige Singleton Variante einer Klasse wie z.B. in Java geben kann. Deswegen mein "Experiment" die Grenzen des Singleton Designs in Javascript zu verstehen.

                              MartinPM Online
                              MartinPM Online
                              MartinP
                              schrieb am zuletzt editiert von MartinP
                              #14

                              @wolfgangfb Du schriebst ja selber ..

                              Für mich bedeutet Singleton, dass es von einer Klasse nur eine Instanz geben darf (so finde ich das auch überall in den Beschreibungen), das bedeutet aber nicht, dass nicht mehrere Objekte auf diese eine Instnz zugreifen können (das ist ja genau der Sinn des Singleton Design Patterns, nämlich dass sich mehrere Objekte die gleichen Resourcen teilen).

                              Wenn nun Instanzen von zwei Klassen auf die Methoden der Singleton-Klasse zugreifen wollen, sollte man das meiner Meinung nach nicht über irgendwelche Vererbungsmechanismen machen... Bei mir würden beide Klassen über eine Referenz auf die Instanz der Singleton-Klasse arbeiten...

                              Im Konstruktor der beiden Klassen wird sich umgeschaut, ob die Instanzierung der Singleton-Klasse schon erfolgt ist, sonst wird das dort erledigt ...

                              Intel(R) Celeron(R) CPU N3000 @ 1.04GHz 8G RAM 480G SSD
                              Virtualization : unprivileged lxc container (debian 12 on Proxmox 8.4.14)
                              Linux pve 6.8.12-16-pve
                              6 GByte RAM für den Container
                              Fritzbox 6591 FW 8.03 (Vodafone Leih-Box)
                              Remote-Access über Wireguard der Fritzbox

                              OliverIOO 1 Antwort Letzte Antwort
                              0
                              • MartinPM MartinP

                                @wolfgangfb Du schriebst ja selber ..

                                Für mich bedeutet Singleton, dass es von einer Klasse nur eine Instanz geben darf (so finde ich das auch überall in den Beschreibungen), das bedeutet aber nicht, dass nicht mehrere Objekte auf diese eine Instnz zugreifen können (das ist ja genau der Sinn des Singleton Design Patterns, nämlich dass sich mehrere Objekte die gleichen Resourcen teilen).

                                Wenn nun Instanzen von zwei Klassen auf die Methoden der Singleton-Klasse zugreifen wollen, sollte man das meiner Meinung nach nicht über irgendwelche Vererbungsmechanismen machen... Bei mir würden beide Klassen über eine Referenz auf die Instanz der Singleton-Klasse arbeiten...

                                Im Konstruktor der beiden Klassen wird sich umgeschaut, ob die Instanzierung der Singleton-Klasse schon erfolgt ist, sonst wird das dort erledigt ...

                                OliverIOO Offline
                                OliverIOO Offline
                                OliverIO
                                schrieb am zuletzt editiert von OliverIO
                                #15

                                @martinp

                                Als erstes muss ich sagen das das von dir erwartete Verhalten nicht einmal in c++ existiert.
                                JavaScript selbst ist keine echte objektorientierte Programmiersprache.

                                Klassendefinitionen sind nur templates
                                Wenn das Objekt erzeugt wird wird das anhand den templates gemacht. Wenn die per extend aufeinander aufbauen, werden die der Reihe nach durch kopiert bis das endgültige Objekt angelegt wurde.
                                Bei einem singleton existiert exakt nur ein Objekt. Wird versucht weitere Objekte neu anzulegen dann wird immer das ursprünglich angelegte erneut zurückzugeben. Das passiert aber nur auf Basis des angegebenen Typ namens. Also bla1 und dann bla1.
                                Machst du bla1 und dann bla2 dann ist das ein komplett neues Objekt.
                                Versuchst du dann danach ein 2. bla2 anzulegen dann erhältst du wieder das erste bla2 zurück.
                                Wie gesagt real existiert kein Objekt Basislager. Das wird nur in die objektdefinition reinkopiert.

                                Diese Aussage gilt für JavaScript.
                                Ob die Aussage auch für typescript gilt kann ich nicht genau sagen. Das muss man Mal nachlesen. Aber ich denke das ist identisch.

                                Beschreibe mal warum du ein singleton haben willst, evtl kann man dann dir bessere Typs geben.
                                Ich persönlich erzeuge singletons nicht über Code im constructor sondern über ein Factory Objekt.
                                Das fühlt sich für mich besser an und ich muss nicht mit statischen variablen rumhantieren

                                https://stackoverflow.com/questions/1479319/simplest-cleanest-way-to-implement-a-singleton-in-javascript

                                Im 2. Beitrag ist ein Beispiel für den Factory Ansatz

                                Hier nochmal der belegt für die Objekt Orientierung in JavaScript

                                To be more precise, JavaScript is a prototype-based Object Oriented Language, which means it doesn't have classes, rather it defines behaviors using a constructor function and then reuses it using the prototype. Note: Even the classes provided by ECMA2015 are objects.

                                https://www.geeksforgeeks.org/introduction-object-oriented-programming-javascript/amp/

                                Meine Adapter und Widgets
                                TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                Links im Profil

                                MartinPM 1 Antwort Letzte Antwort
                                1
                                • OliverIOO OliverIO

                                  @martinp

                                  Als erstes muss ich sagen das das von dir erwartete Verhalten nicht einmal in c++ existiert.
                                  JavaScript selbst ist keine echte objektorientierte Programmiersprache.

                                  Klassendefinitionen sind nur templates
                                  Wenn das Objekt erzeugt wird wird das anhand den templates gemacht. Wenn die per extend aufeinander aufbauen, werden die der Reihe nach durch kopiert bis das endgültige Objekt angelegt wurde.
                                  Bei einem singleton existiert exakt nur ein Objekt. Wird versucht weitere Objekte neu anzulegen dann wird immer das ursprünglich angelegte erneut zurückzugeben. Das passiert aber nur auf Basis des angegebenen Typ namens. Also bla1 und dann bla1.
                                  Machst du bla1 und dann bla2 dann ist das ein komplett neues Objekt.
                                  Versuchst du dann danach ein 2. bla2 anzulegen dann erhältst du wieder das erste bla2 zurück.
                                  Wie gesagt real existiert kein Objekt Basislager. Das wird nur in die objektdefinition reinkopiert.

                                  Diese Aussage gilt für JavaScript.
                                  Ob die Aussage auch für typescript gilt kann ich nicht genau sagen. Das muss man Mal nachlesen. Aber ich denke das ist identisch.

                                  Beschreibe mal warum du ein singleton haben willst, evtl kann man dann dir bessere Typs geben.
                                  Ich persönlich erzeuge singletons nicht über Code im constructor sondern über ein Factory Objekt.
                                  Das fühlt sich für mich besser an und ich muss nicht mit statischen variablen rumhantieren

                                  https://stackoverflow.com/questions/1479319/simplest-cleanest-way-to-implement-a-singleton-in-javascript

                                  Im 2. Beitrag ist ein Beispiel für den Factory Ansatz

                                  Hier nochmal der belegt für die Objekt Orientierung in JavaScript

                                  To be more precise, JavaScript is a prototype-based Object Oriented Language, which means it doesn't have classes, rather it defines behaviors using a constructor function and then reuses it using the prototype. Note: Even the classes provided by ECMA2015 are objects.

                                  https://www.geeksforgeeks.org/introduction-object-oriented-programming-javascript/amp/

                                  MartinPM Online
                                  MartinPM Online
                                  MartinP
                                  schrieb am zuletzt editiert von
                                  #16

                                  Es geht mir darum, dass man die Finger vom "Erben" von einer Klasse lassen sollte, die als Singleton designt ist ...

                                  Wenn man eine Singleton-Klasse designt hat, die Rechtecke und Kreise verwalten soll, und man ein Klasse braucht, die nur die Rechtecke verwaltet, sollte sie das Singleton-Objekt referenzieren, und sich dessen Methoden bedienen, aber nicht von ihr abgeleitet sein ...

                                  Intel(R) Celeron(R) CPU N3000 @ 1.04GHz 8G RAM 480G SSD
                                  Virtualization : unprivileged lxc container (debian 12 on Proxmox 8.4.14)
                                  Linux pve 6.8.12-16-pve
                                  6 GByte RAM für den Container
                                  Fritzbox 6591 FW 8.03 (Vodafone Leih-Box)
                                  Remote-Access über Wireguard der Fritzbox

                                  1 Antwort Letzte Antwort
                                  0
                                  Antworten
                                  • In einem neuen Thema antworten
                                  Anmelden zum Antworten
                                  • Älteste zuerst
                                  • Neuste zuerst
                                  • Meiste Stimmen


                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  686

                                  Online

                                  32.6k

                                  Benutzer

                                  82.1k

                                  Themen

                                  1.3m

                                  Beiträge
                                  Community
                                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                  ioBroker Community 2014-2025
                                  logo
                                  • Anmelden

                                  • Du hast noch kein Konto? Registrieren

                                  • Anmelden oder registrieren, um zu suchen
                                  • Erster Beitrag
                                    Letzter Beitrag
                                  0
                                  • Home
                                  • Aktuell
                                  • Tags
                                  • Ungelesen 0
                                  • Kategorien
                                  • Unreplied
                                  • Beliebt
                                  • GitHub
                                  • Docu
                                  • Hilfe