NAS

JavaScript Klassen vererben

WhiteShark

Admiral
Registriert
Mai 2002
Beiträge
9.949
Nabend,

ich will ein wenig Ordnung in meine Scriptstruktur bringen, ohne alles umbauen zu müssen.

Bspw habe ich eine Klasse Slider mit diversen privaten und public Funktionen (next(), prev(), usw).
Diese möchte ich um diverse weitere Funktionen erweitern (Ajax-Loader, Galerie-Funktionen, usw).

ich möchte dazu aber nicht jede Funktion einzeln über prototype hinzufügen, sondern quasi eine zweite Klasse haben, welche als Basis die slider-Klasse verwendet.

Etwa so (verkürzt)
Slider
Code:
var Slider = function(newConfig) {
  var private Variablen/Methoden;

  this.next = function() {
    ...
  }

  slideMove = function() { // private Funktion
    ...
  }
}

Und GallerySlider
Code:
var GallerySlider = function(newConfig) {
  var private Variablen/Methoden (nur für Galerie)

  createGallery() {
    ...
  }
}


Diese beiden Klassen will ich nun verbinden, so das ich new GallerySlider() machen kann und dann aus beiden Klassen alle Methoden zur Verfügung habe, mit new Slider() allerdings nur die aus der Slider-Klasse.

Wie bekomme ich das am einfachsten hin?

Danke schonmal
 
Ich hab mal was mit NeueKlasse.prototype = AlteKlasse.prototype gelesen, es aber dann nicht benutzt, weil ich damit keine statischen Funktionen mit übertragen konnte, also eher schlecht als Vererbung im klassischen Sinne benannt werden kann.
 
Es können auch keine private Funktionen/Variablen damit vererbt werden. Nur public
Ich brauche aber von der Basisklasse alles.
Habe allerdings nun eine Lösung gefunden...

Drauf gestossen bin ich, indem ich console.debug auf die Basisklasse gemacht habe und mir dachte, dass man das was in der Konsole steht, doch sicher auch per eval in die zweite Klasse bekommt...

Hier die Funktion um den Inhalt der Klasse zu extrahieren:
Code:
getFunctionInner = function(code) {
	var splitCode;
	if (typeof(code) === 'function') {
		code = code.toString();
	}
	
	splitCode = code.split('{');
	splitCode.shift();
	code = splitCode.join('{');
	
	code = code.substr(0, code.lastIndexOf('}'));
	
	return code;
}

Code:
var GallerySlider = function(newConfig) {
	// Basisklasse laden	
	eval(getFunctionInner(Slider));
        ...
}

Funktioniert wunderbar.

Danke für die Hilfe
 
javaScript ist ein wenig kompliziert mit klassischer Vererbung.

Grundsätzlich kannst du nach der Definition deiner beiden Funktionen
Code:
GallerySlider.prototype = Slider;
machen. Damit werden auch (@Yuuri) shared functions mit übertragen. Dein Konstruktor ist nun allerdings GallerySlider, d.h. du musst innerhalb deiner GallerySlider function
Code:
Slider.call(this, newConfig);
aufrufen, sonst wird nur GallerySlider und nicht Slider ausgeführt.

Kritisch dabei ist, wenn du den prototype einfach als Funktion angibst, überschreibst du in der abgeleiteten Funktion die Werte der Basisfunktion. Daher habe ich einen ausführlicheren Artikel über class functions in javaScript veröffentlicht, zu lesen unter http://metadea.de/V/ .

Code:
eval(getFunctionInner(Slider));
WAH !! Mach das nicht, das sieht nicht nur furchtbar aus, ist falsch und evil !!

Übrigens kannst du mit echtem prototyping nun auch instanceof verwenden:
Code:
var o = new GallerySlider();
o instanceof GallerySlider === true
o instanceof Slider === true // Update: false
o instanceof Object === true

Update: War leider ein wenig voreilig mit der Antwort hier. Siehe weiter unten...
 
Zuletzt bearbeitet:
@ice Ja ich bemerke gerade, warum ich mit meinem V javaScript Framework nicht falsch liege.


Echte Vererbung in javaScript funktioniert nur wie beschrieben in V javaScript framework.

Denn, wenn du B.prototype = new A() aufrufst, wird dein Konstruktor A bereits zur Definitionszeit ausgeführt, nicht erst wenn du new B() aufrufst.

Und mit B.prototype = A ist das new B nicht instanceof A...

Simple Inheritance von Resig ist leider nur eine simple Variante, da hier von einem (Definitions-)Objekt zum Anderen kopiert wird und du keine privaten Variablen und Funktionen hast (es ermöglicht zwar Vererbung und instanceof, aber keinen privaten Raum). Die Grundlage einer Klassendefinition in Simple Inheritance ist das Definitions-Objekt(-Literal) und nicht eine Funktion.
 
Zuletzt bearbeitet: (Resig mal wieder unterschätzt ;))
Zurück
Oben