Vererbung in JavaScript
Christian S.
- javascript
Hallo,
ich habe eine Basisklasse in JavaScript:
function Base()
{
}
Base.prototype.Myfunction = function()
{
// tu was
}
[...]
dann habe ich ein Objekt, das all die Methoden und Properties der Basisklasse haben soll (+ weitere eigene):
var myObject = {};
myObject.WeitereProperty = true;
Später möchte ich einfach myObject.Myfunction() aufrufen können.
kann ich das so irgendwie machen:
myObject.prototype = Base;
??
Gruß
Christian
gruss Christian S.
ich habe eine Basisklasse in JavaScript:
function Base() {
/*
so weit so gut -
das hier ist Dein: [[Base]]-konstruktor.
umgangssprachlich kannst Du das ding auch ruhig als
Klasse bezeichnen, obwohl immer mal wieder darauf
hingewiesen sein soll, dass JavaScript klassenlos ist -
es gibt nur objekte. diese koennen von konstruktoren
erzeugt werden, muessen es aber nicht.
vererbung erfolgt zum einen ueber das [prototype]-objekt,
sofern dieses vorhanden ist (bei reinen objekten - z.b.:
var obj = {}; - muss diese eigenschaft ausdruecklich
gesetzt werden).
maechtiger noch ist in JavaScript das konzept der
schnittstellenvererbung. das [[Function]] objekt
des Sprachkerns stellt die beiden methoden [apply]
und [call] fuer diese art (kontextabhaengiger)
delegation zur verfuegung.
*/
}
> ...
> ~~~javascript
Base.prototype.myFunction = function () {
/*
stil:
es gibt zwar keine zwingende schreibstil-konvention,
trotzdem sollte man grosse anfangsbuchstaben nur fuer
konstruktoren verwenden.
*/
> };
...
var myObject = {};
myObject.WeitereProperty = true;
// myObject.weitereProperty = true; // siehe oben.
> ...
> Später möchte ich einfach myObject.Myfunction() aufrufen können.
>
> kann ich das so irgendwie machen:
>
> myObject.prototype = Base;
du warst nah dran, fuer Deine zwecke muss der [prototype] aber
kein konstruktor sein, sondern ein durch diesen konstruktor
erzeugtes objekt:
~~~javaScript
myObject.prototype = new Base(); // manche schreiben auch ...
myObject.prototype = new Base; //, was auch nicht falsch ist.
by(t)e by(t)e - peterS. - pseliger@gmx.net
Hi,
myObject.prototype = Base;
du warst nah dran, fuer Deine zwecke muss der [prototype] aber
kein konstruktor sein, sondern ein durch diesen konstruktor
erzeugtes objekt:
myObject.prototype = new Base();
also es ging eher so:
var myObject = new Base();
weitere Members kann ich dann mit:
myObject.myprop = 3;
zuweisen.
Ist diese Vererbung auch möglich, wenn ich myObject durch ein Literal deklariere??
also so:
var myObject = {myprop:3};
und dass dann trotzdem noch geerbt wird von Base ??
es nervt noch ein bisschen jedes mal myObject zu schreiben...
Gruß
Christian
hallo again Christian,
Ist diese Vererbung auch möglich, wenn ich myObject durch
ein Literal deklariere?? ... also so:var myObject = {myprop:3};
und dass dann trotzdem noch geerbt wird von Base ??
probier es doch einfach aus - ich hab' mich dazu doch
schon in meiner ersten antwort geaeussert. in Deinem
bsp. ist mir Deine ungewoehnliche vererbungsstrategie
durchaus aufgefallen - JavaScript ist sehr flexibel; es
sollte nichts dagegen sprechen, auch auf dem von Dir
gewaehlten weg zum ziel zu gelangen:
~~~javascript
var myObject = {myprop:3};
myObject.prototype = new Base();
neugierig - peterS. - pseliger@gmx.net
--
»Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - [Douglas Crockford](http://javascript.crockford.com/)
ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
hallo Interessierte,
weitere erklaerungen und loesungsansaetze werden
im moment unter geandertem thema ausnahmsweise
in einem neuen thread gegeben bzw. weiterdiskutiert:
Objekte (Literale) erben lassen
um verstaendnis bittend - peterS.