Prototypen in JavaScript
Erklärung des Verfahrens zum Aufsuchen einer Definition (Prototypen)
Es kommt vor, daß viele verschiedene Objekte dieselbe Methode enthalten sollen. Beispielsweise sieht man, daß die folgenden verschiedenen String-Objekte alle eine Methode charAt enthalten.
- Debugger
new String( "abc" ).charAt( 0 ) // "a" //
new String( "alpha" ).charAt( 0 ) // "a" //
new String( "anton" ).charAt( 0 ) // "a" //
Es wäre unökonomisch, die Methode »charAt« nun immer wieder in jedem String-Objekt abzuspeichern.
Stattdessen enthalten alle String-Objekte einen Verweis auf ein Objekt, in welcher die String-Methoden gespeichert sind. Dieses Objekt wird der Prototyp jener Objekte genannt.
Ruft man nun eine Methode, wie »charAt« auf, welche in dem Zielobjekt (dem Objekt, das links vom Punkt angegeben ist) nicht gefunden wird, so sucht JavaScript im Prototyp nach einer Definition.
In den obigen Beispielen wird die charAt-Methode gefunden, weil sie im Prototyp der Objekte enthalten ist. (Sie ist nicht in den Objekten selber enthalten.)
Der Konstruktor kennt diesen Prototyp und trägt ihn bei der Objekterzeugung mit new in die Objekte ein. Jeder Konstruktor hat eine Prototyp-Definition, deren Wert den von jenem Konstruktor erzeugten Objekten als Prototyp zugewiesen wird.
Da der Prototyp nicht in einer intuitiven Weise angezeigt wird, ist es am besten, sich zur anschaulichen Darstellung eines Prototyps den Namen des Konstruktors anzeigen zu lassen, von dem er in das Objekt eingetragen wurde.
- Debugger
Object.getPrototypeOf( new String( "abc" )) // [object String] //
Object.getPrototypeOf( new String( "abc" ))=== Object.getPrototypeOf( new String( "alpha" )) // true //
Object.getPrototypeOf( new String( "abc" ))=== Object.getPrototypeOf( new String( "anton" )) // true //
Object.getPrototypeOf( new String( "alpha" ))=== Object.getPrototypeOf( new String( "anton" )) // true //
Object.getPrototypeOf( new Number( 123 )) // [object Number] //
Object.getPrototypeOf( new String( "alpha" ))=== Object.getPrototypeOf( new Number( 123 )) // false //( new String( 1 )).toString === String.prototype.toString // true //
( new Number( 1 )).toString === Number.prototype.toString // true //
( new Number( 1 )).toString === String.prototype.toString // false //
( new Object( 1 )).toString === String.prototype.toString // false //Object.prototype.toString.apply( new String( "abc" )) // "[object String]" //
Object.prototype.toString.apply( Object.getPrototypeOf( new String( "abc" ))) // "[object String]" //
Der Prototyp eines Objekts ist nicht dasselbe wie der Wert seiner Prototypdefinition!
Konsole
let ob2 = new Number( 2 ); // undefined //
Object.getPrototypeOf( ob2 ) // [object Number] //
ob2.prototype = "zeta"; // "zeta" //
ob2.prototype // "zeta" //
Object.getPrototypeOf( ob2 ) // [object Number] //