Christoph: beispielhafte Zusammenfassung von JavaScript als Sprache der OO.

Beitrag lesen

Moin.

In Self ist es einfach möglich, eine Vererbungshierarchie mit Tiefen > 1 zu bauen,
in JavaScript nicht.

warum denn nicht, dafuer kann man doch jedem konstruktor ein prototypisches
objekt zur seite stellen - das von Dir kritisierte *constructor.prototype*.

Entschuldige bitte, aber dass, was du als Beispiel ablieferst, überzeugt mich nur noch mehr von meinem Standpunkt, da du hier Funktionalität über Closures nachbauen musst, für die die Sprache keine syntaktische Unterstützung liefert. Ich habe die für die Vererbung relevanten Teile deines Codes mal für mich verständlich aufgedröselt:

  
function Ancestor() {  
 this.ancestorProp = 1;  
}  
Ancestor.prototype.ancestorProtoProp = 1;  
  
var Instance = (function() {  
 function Constructor() {  
  this.instanceProp = 1;  
 }  
 Constructor.prototype = new Ancestor;  
 Constructor.prototype.instanceProtoProp = 1;  
 return Constructor;  
})();  

Das funktioniert, hat aber den Nachteil, dass der Konstruktor Ancestor während der Definition von Instance und nicht bei der Instanziierung über new Instance ausgeführt wird. Daher bevorzuge ich folgende Variante:

  
Function.prototype.extend = function(ancestor) {  
 function Prototype() {}  
 Prototype.prototype = ancestor.prototype;  
 this.prototype = new Prototype();  
 return this;  
};  
  
function Ancestor() {  
 this.ancestorProperty = 1;  
}  
Ancestor.prototype.ancestorProtoProperty = 1;  
  
function Instance() {  
 Ancestor.call(this);  
 this.instanceProperty = 1;  
}  
Instance.extend(Ancestor);  
Instance.prototype.instanceProtoProperty = 1;  

Allerdings bietet JavaScript keine syntaktische Unterstützung für diesen Programmierstil ...

doch, das obige bsp. sollte das gegenteil beweisen.

Das würde ich nicht als syntaktische Unterstüzung bezeichnen, sondern als Workaround...

... (was sich natürlich problemlos in 3 Zeilen Code beheben lässt), aber damit wären wir
wieder beim Argument, dass auch in C objektorientiert programmiert werden kann, nur halt
ohne nette Syntax.

die nette syntax zaehlt aber nicht als argument ;-)

Doch. Sie ist das _einzige_ Argument, dass zählt, da sich in (fast) jeder Sprache objektorientiert programmieren lässt!

In meinen Augen sind nur die folgenden Alternativen konsistent:
  1. C ist keine OO-Sprache, JavaScript ist OO-Sprache (aber weder eine reine noch eine klassische)
  2. C ist OO-Sprache, JavaScript ist reine OO-Sprache

Ich tendiere stark zu 1.

fuer 1) breche ich hier doch die ganze zeit immer wieder eine neue lanze.

Na dann sind wir uns ja eigentlich einig ;)

Christoph