molily: Delegation mit Prototypen

Beitrag lesen

Dein Problem ist eher der Unterschied zwischen einer deep copy und einer shallow copy. Eine deep copy erzeugt ein neues Objekt mit allen Eigenschaften des Orginals, was aufwendig ist, deshalb wird es selten gemacht.

Eine dritte Möglichkeit ist, ein Objekt zu erzeugen, das an das zu »kopierende« per Prototyp delegiert. Dafür bietet ECMAScript 5 Object.create(), welches man für Browser, die die Methode noch nicht kennen, nachbauen kann.

Ein Kopieren des gesamten Objekts ist in dem Fall nicht nötig, man hat vielmehr einer Art Copy-on-Write:

var obj = { foo : 1 };  
var copy = Object.create(obj);  
alert(copy.foo); // Holt »foo« vom Prototyp  
alert(copy.hasOwnProperty('foo')); // false  
copy.foo++; // Holt »foo« vom Prototyp, aber erzeugt dann eine neue Eigenschaft »foo« bei »copy«  
alert(copy.hasOwnProperty('foo')); // true  
alert(obj.foo); // 1  
alert(copy.foo); // 2

Prototypen verstehen: Die Glasplatten-Metapher

Object.create() ist ziemlich genial. Mit dieser einfachen Möglichkeit, prototypische Delegation umzusetzen, kommt JavaScript endlich zu sich selbst. Mit ES5 kommen zudem noch Property Descriptors hinzu, d.h. wir haben gewisse Zugriffsrechte, Konstanten, Getter/Setter usw.

http://dmitrysoshnikov.com/ecmascript/es5-chapter-1-properties-and-property-descriptors/
http://www.slideshare.net/douglascrockford/newandimproved
http://www.slideshare.net/kangax/say-hello-to-ecmascript-5
http://davidflanagan.com/Talks/es5/slides.html

Mathias