Orlok: Unschönes am Prototyping

Beitrag lesen

Hallo Jörg

Unschön: Es werden auch bereits abgeleitete Objekte geändert und dabei Eigenschaften und Methoden überschrieben.

Das ist das Grundprinzip, nach dem Vererbung in JavaScript funktioniert. Sprich, vergleichbar mit der identifier resolution innerhalb der scope chain wird beim Zugriff auf eine Eigenschaft zunächst einmal geprüft, ob das jeweilige Objekt eine eigene Eigenschaft mit dem entsprechenden Bezeichner besitzt. Ist dies nicht der Fall, dann wird geprüft, ob der Prototyp des Objektes über eine solche Eigenschaft verfügt, und wenn dem so ist, diese Eigenschaft referenziert. War die Suche bei diesem Objekt jedoch ebenfalls ohne Erfolg, dann wird wiederum bei dessen Prototyp nachgesehen, und so weiter und so fort. Geerbte Eigenschaften sind hier also immer eigene Eigenschaften eines anderen Objektes.

Wird ein Instanzobjekt durch den Aufruf einer Funktion als Konstruktor erzeugt, dann bedeutet das, dass diese Funktion im Kontext des Objektes ausgeführt wird, die Funktionsvariable this also mit dem erstellten Objekt initialisiert wird. Die innerhalb des Konstruktors vorgenommenen Zuweisungen erzeugen mithin eigene Eigenschaften des auf diese Weise erstellten Objektes.

var Constructor = function ( ) {
  'use strict';
  this.foo = 1;
  this.bar = 2;
};

Constructor.prototype.baz = 3;

var a = new Constructor( );
console.log(Object.getOwnPropertyNames( a )); // ['foo', 'bar']

var b = new Constructor( );
console.log(Object.getOwnPropertyNames( b )); // ['foo', 'bar']

Sowohl a als auch b verfügen hier nun über die eigenen Eigenschaften foo und bar, während baz eine eigene Eigenschaft des Objektes bleibt, welches der Wert von Constructor.prototype ist, denn da hier weder a noch b über eine eigene Eigenschaft mit dem Bezeichner baz verfügen, wird beim Zugriff auf die Eigenschaft in der Prototypenkette gesucht und dem zur Folge bei beiden Instanzobjekten Constructor.prototype.baz referenziert. Wird diese Eigenschaft nun verändert, dann betrifft diese Veränderung selbstverständlich auch beide Objekte, a und b.

Gruß,

Orlok

--
„Das Wesentliche einer Kerze ist nicht das Wachs, das seine Spuren hinterlässt, sondern das Licht.“ Antoine de Saint-Exupéry