CJay: Prototype

Hallo Forum.
Ich hätte eine Frage bezüglich des Javascript Objekt Prototype.
Und zwar kann man es auch so in der Art schreiben?

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

anstatt jedesmal:

  
Object.prototype.indexOf= function(){  
}  

zu schreiben?

  1. Lieber CJay,

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

    hast Du es ausprobiert? Was hat Dir Deine JS-Fehlerkonsole gesagt?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. 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