peterS.: Vererbung vs. Komposition - Delegation als Mittel der Wahl in JS

Beitrag lesen

gruss Christoph,

JavaScript ist klassenlos !

Richtig, JavaScript unterstützt prototypische Vererbung. Allerdings in einer
meiner Meinung nach extrem schwachsinnigen Form über constructor.prototpe -

dafuer kann ich nichts - das steht hier aber auch nicht zur debatte.

ein direkter Zugriff auf [[Prototype]] ist nicht möglich. Statt dessen wird
man zu pseudo - klassenbasierter Programmierung gezwungen.

aber doch nur, wenn man seine klassenbasierte denke nicht ablegen kann.

man kann aeusserst effizient programmieren, wenn man sich gar nicht erst
auf die von »constructor.prototpe« als fata morgana unscharf am horizont
versprochene emulation einer klassenbasierenden vererbung einlaesst.

... man bleibe in seiner komoden funktionalen oase und preise deren
    immerfrischen quellen [apply] und [call].

im ernst, »constructor.prototpe« findet seine einzig sinnvolle und dann auch
effektive anwendung im hinzufuegen von (oeffentlichen) prototypischen methoden.
mehr braucht es auch nicht.

Allerdings ist JavaScript mächtig genug, um dieses Situation mit wenigen
Zeilen Code (meine Version) in Ordnung zu bringen...

sauber gemacht, und fuer die klassendenke genau richtig. ich verschliesse
mich dieser konzeption in den wenigen faellen, in denen sie effektiver ist
auch ueberhaupt nicht.

zum spass und zur veranschaulichung hab ich Dein beispiel aber mal so
hingebogen, dass es nur auf objekten aufbaut. normalerweise wuerde man
das aber auf zwei bis drei objekte eindampfen. Dein bsp. ist aus sicht
der klassenbasierten OO gut gewaehlt - meine vergewaltigung Deiner
*pseudoklassen*-konstruktoren zu objekten ist natuerlich voellig an
der praxis vorbei - trotzdem kann ich Deinen hund zum schluss ganz
einfach auch miauen lassen, im kontext von [strangeDog] macht [killer]
dann noch ganz andere sachen:

[code lang = javascript]var animal = {

makeSound : (function(sound) {

return (sound || this.sound || animal.sound);
  }),
  sound : "grmpf"
};

var dog = {

sound : "Wuf"
};

var myDog = {

bark : (function(sound) {

alert(this.owner + "'s dog " + this.name + " says " + animal.makeSound.call(this, (sound || dog.sound)));
  }),
  owner: "unknown",
  name: "unknown"
};
var strangeDog = {

bark : (function(sound) {

alert(this.owner + "'s dog " + this.name + " says " + animal.makeSound.call(this, sound));
  })
};

var killer = {

name: "Killer",
  owner: "cygx"
};

myDog.bark.call(killer);         // "Wuf"
myDog.bark.call(killer, "meow"); // "meow"

strangeDog.bark.call(killer, "quak"); // "quak"
strangeDog.bark.call(killer);         // "grmpf"[/code]

der durch ECMA 262 standardiesierte sprachkern von JavaScript
beschreibt eine multiparadigmensprache - JavaScript ist sowohl
reine funktionale programmiersprache

Nein, nicht wirklich.

meinetwegen - dann formuliere ich praeziser (siehe auch mein
zweiter sprachdefinitionsveruch in meiner antwort an Christian):

» ... Obwohl im Grunde eine funktionale Skriptsprache, läßt sich in JavaScript
  sowohl prozedural als auch rein funktional bzw. objektorientiert programmieren.«

als auch sprache der OOP, denn sie erfuellt alle anforderungen,
wie z.b. kapselung, vererbung und vielgestaltigkeit.

Wobei es für nicht jedes dieser Konzepte 'syntactic sugar' gibt.

muss es ja auch nicht - da kommt die grosse flexibilitaet eines funktionalen
sprachkonzepts zum tragen.

Das ist aber gerade der Punkt: Objekt - ortientiert kann man auch in C progammieren
(ist auch nicht wirklich kompliziert), trotzdem würde niemand C als OO-Sprache bezeichnen...

uuh, das bsp. ist boes' gewaehlt - gerade C und seine abkoemmlinge mit seinem/deren
so langem evolutionaeren entwicklungsweg ins feld zu fuehren ist schamlos gemein ;-)

C++ wuerde ich aber schon als objektorientiert bezeichnen, obwohl es ja auch mehreren
programmierparadigmen genuegt.

so long - 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
ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:]