molily: Prototype

Beitrag lesen

Hallo,

Und zwar kann man es auch so in der Art schreiben?

Object.prototype= {
     indexOf:function(){

}
}


> anstatt jedesmal:  
> ~~~javascript
  

> Object.prototype.indexOf= function(){  
> }  
> 

zu schreiben?

Ja, kann man – allerdings hat das gewisse Auswirkungen. Ob man die in Kauf nehmen will, hängt vom konkreten Fall ab.

Zum Vergleich:

1. Konstruktor.prototype.eigenschaft = wert;

  • Dies *erweitert* den Prototyp aller *bestehenden* und *zukünftigen* Instanzen, die der Konstruktor erzeugt hat oder erzeugen wird.
  • Wenn du eine Funktion erzeugst, hat sie bereits eine prototype-Eigenschaft. Darin steckt bereits ein einfaches Objekt, welches
    a) eine constructor-Eigenschaft hat, die auf die Konstruktorfunktion zeigt,
    b) einen eigenen Prototypen besitzt (interner [[Prototype]]-Verweis, in einigen Browsern als __proto__ sichtbar). Das ist üblicherweise Object.prototype, kann aber bei Vererbung auch ein anderes Objekt sein, z.B. SuperConstructor.prototype.
  • Bei der Erweiterung von Konstruktor.prototype bleiben alle vorher gesetzten Eigenschaften wie constructor sowie der interne Prototyp-Verweis intakt.

2. Konstruktor.prototype = {};

  • Dies *setzt* den Prototypen für alle Objekte, die *in Zukunft* mit dem Konstruktor erzeugt werden.
  • Sofern du nicht explizit eine constructor-Eigenschaft notierst, so geht diese verloren. Zudem geht eine spezielle Vererbung verloren, denn der Prototyp des Objekt-Literals ist nur Object.prototype.
  • Alle bisher mit dem Konstruktor erzeugte Instanzen *behalten* ihren alten Prototypen.

Diese Unterschiede spielen nicht unbedingt eine Rolle. Wenn du nirgends auf die constructor-Eigenschaft zugreifst, keine besondere Vererbung aufsetzt und vorher keine Instanzen erzeugst, kannst du die prototype-Eigenschaft überschreiben.

Andernfalls ist die Schreibweise Konstruktor.prototype.eigenschaft = wert vielseitiger und defensiver.

Hintergrund:
http://molily.de/javascript-core/
http://molily.de/js/organisation-instanzen.html
http://molily.de/weblog/javascript-pseudoklassen
http://www.2ality.com/2012/01/js-inheritance-by-example.html
http://www.2ality.com/2013/01/two-prototypes.html

Grüße,
Mathias