# Javascript & klassen



## wachteldonk (1. November 2007)

Wie defineire ich eine Klasse mit privaten Variablen, Methoden udn einem Konstruktor in JS ?

ich sehe immer etwas wo eine function definiert wird und das soll die klasse sein und dann lauter eigenständige funktionen definiert werden. Woher wies JS , das diese Funktionen als Methode zu der erstemn Klassenfunktion gehören?

hat mal jemand eine Klasse die s.o. enthält als einfaches Beispiel?


----------



## con-f-use (2. November 2007)

Javascript ist keine höhere Programmiersprache. Konzepte wie öffentliche und private Variablen bzw. Klassen existieren schlichtweg nicht und machen auch keinen Sinn, weil der Quelltext mit an den Client übertragen wird. Als Konstruktor könnte man den onload-Event verwenden, das ist aber eine sehr wacklige Konstruktion.

Hier ist ein Tutorial zu OOP in Javascript. Es sollte dir alle deine anderen Fragen beantworten Das ist alles. Mehr außer vielleicht dem prototype-Objekt gibt es nicht an OOP in JS. OOP allgemein ist in Javascript wenig sinnvoll, wenn auch zumindest teilweise möglich. Wenig sinnvoll deswegen, weil Javascript ohnehin nur für kleine Spielerein im Gegensatz zu großen Applikationen in umfangreichen Projekten mit vielen Programmieren gedacht ist.

Bottom line: Was immer du vor hast, vergiss es, schreibe es funktional oder nutze eine höhere Programmiersprache.

P.S.
Und halte dich bitte an die Regeln der Netiquette insbesondere, was Groß-/Kleinschreibung angeht. Du hast ihr beim Registrieren zugestimmt...


----------



## FipsTheThief (3. November 2007)

Con-f-use ich möchte Dir in einigen Punkten widersprechen in JS kann man schon OOP programmieren wenn man es darauf anlegt.Sogar Vererbung ist möglich aber man hat hier klar seine Grenzen.

Es gibt auch sowas wie öffentliche und private Methoden man muss ja nicht immer alles gleich in einer Funktion mit this.irgendwas deklarieren.
Richtig man sieht meistens sowas wie :


```
function foo() {
}

foo.prototype.bar = function () {}
```

Diese Funktion ist dann auch öffentlich zugänglich und wäre eingentlichdas gleiche wie:


```
function foo() {
   this.bar = function () {}
}
```

Aber das geht auch 

```
function foo() {
    function bar() {} // die ist privat auf da wirst nie zugriff von aussen bekommen können
}
```

Vererbung 

```
function foo() {
    this.test = function () {
         alert("hallo welt");
    }
}

function bar() {
}
bar.prototype = new foo();

var test = new bar();
test.test();
```

Überschreiben von Methoden

```
function foo() {
    this.bar = function () {
         alert('foobar');
    }

    this.initfoo() = function () {
        this.bar(); 
    }
}

function foo2 () {
  this.constructor(this); //ohne dies würde initfoo die Funktion bar aus foo aufrufen
  
  this.bar = function () {
     alert('barfoo');  
  }
}
foo2.prototype = new foo();

var test = new foo2();
test.initfoo();
```

Große Schwachstelle

```
function foo() {
    this.bar = function () {
         alert('foobar');
    }

    this.initfoo() = function () {
        this.bar(); 
    }
}

function foo2 () {
  this.bar = function () {
     alert('barfoo');  
  }
}
foo2.prototype = new foo();

function foo3 () {
  //man könnte nun meinen das er nun bei foo2 rauskommt
  //aber es geht gleich hoch bis foo() 
  this.constructor(this); 
  
  this.bar = function () {
     alert('überschrieben barfoo');  
  }
}
foo3.prototype = new foo2();
```

Das soll heißen man kann nicht direkt auf den Constructor von foo2() zugreifen mehr er wandert gleich bis an die Spitze der Nahrungskette foo() hoch.

Singleton Patterns kann man ebenfalls umsetzen mit Hilfe von new Object() sowie kann man auch Object als "statische Klasse" missbrauchen.
Also man kann damit schon sehr viele hübsche Sachen machen auch nützliche.

Mhm mein erstes Projekt mit volles Rohr javascript OOP war http://www.bitraum.de und zwar gibt es da als gutes Beispiel auch eine Fenster Klasse.

Fenster davon leiten sich ab BaseWindow und ExtendedBaseWindow , beide kann man schliessen ExtendedWindow hat noch nen paar Extras mit Drinnen wie schließen und in die Taskleiste verschieben oder vergrössern,verkleinern und den Resize Button unten rechts.

Von ExtendedWindow leitet sich ab FileWindow welches ein spezielles Template nutzte und noch ExtendedFileWindow wo man noch zwischen den Code und Beispiel hin und herschalten konnte. Zum Beispiel

2. Beispiel 

Ich habe 2 Klassen Load und Preload. Load würde für sich alleine gut arbeiten , wollen wir aber nun noch ein Preload Bildchen reinhaun dann starte ich die Klasse Preload und gebe dem ganzen noch ein Load Object mit auf den Weg was geladen werden soll.
Somit kann ich x Preloader schalten und jeder würde für sich sein einges Load Object abhandeln ob Bilder oder Ajax Content je nachdem was man möchte. 

Also da ist schon viel drinnen es ist immer nur die Frage wie weit man es ausreizen möchte.


----------



## con-f-use (3. November 2007)

Habe nie behauptet, dass es nicht möglich ist, sondern nur, dass man größere Verrenkungen machen muss und es daher nur bedingt sinnvoll ist. Was du beschreibst ist keine echte Vererbung bzw. keine echten public/privat-Funktionen im Sinne eines Zugriffsmanagement wie beispielsweise in Java oder C++.


----------



## FipsTheThief (3. November 2007)

Mag sein das es keine richtige Vererbung wie in C++ oder Java ist , aber 2 Sachen. A es funktioniert prima und B ist JavaScript wie der Name schon sagt immer noch eine Script Sprache  Und sie funktioniert in OOP Bereich so gut wie in PHP naja bis auf die Tatsache das PHP 5 doch etwas ausgereifter ist.
Dieses ganze private,protected , public und default existiert hier einfach mal nicht.Auch Überladen funktioniert leider nicht es gibt klare Grenzen. Aber wir laden auch keine kompletten Packages rein.Im groben kann man aber doch von private und public sprechen.

Und so große Verrenkungen sind das nun auch nicht , es mag merkwürdig aussehen aber die paar Zeilen kann sich jeder einrprägen und sinnvoll finde ich es inzwischen auch sehr wenn man größere Sachen plant als ein Pop Up oder ähnliches bzw würde ich es gar nicht mehr anders machen wollen.
Da es einen so viel mehr Möglichkeiten bietet und man richtig viel umsetzen kann.Durch diese ich nenn es mal nun Pseudo OOP lässt sich auch sehr gut Modular programmieren, was man einmal hat kann man noch 20 mal bei der selben Seite einpflegen ohne irgendwie zaubern zu müssen da alles schön für sich gekapselt ist.

In dem Sinne geht alles


----------

