Aus der Metapher geht leider nicht hervor, dass beim Überschreiben einer Eigenschaft der descriptor von etwaigen Namensvettern in der Prototype-Kette geerbt wird.
Das klingt so, als würde beim neuen Objekt ein Property mit diesem Descriptor angelegt, was aber nicht der Fall ist. Den Fall, den du beschreibst, kann man nicht so verallgemeinern. Enumerable, configurable oder writable vererben sich keinesfalls auf Eigenschaften.
var o1,o2;
o1 = {};
Object.defineProperty(o1,"a",{
set : function(val){ this.val = val + 1; },
get : function(){ return this.val; }
});o1.a = 0;
console.log(o1.a); // 1o2 = Object.beget(o1);
o2.a = 10;
log(o2.a);
console.log(o2.a); // 11
Das ist klar, hier wird an o2 auch nie eine Property a angelegt.
o2.a = löst auf den Setter am Prototyp auf. Der holt sich val über die Prototype-Chain und erzeugt eine Property val an o2. o2.a löst dann ebenfalls auf den Getter am Prototyp auf.
Wenn man einen vererbten Setter am lokalen Objekt überschreiben will, kann man selbstverständlich nicht o.setter = … verwenden, denn das ruft ihn nur auf. Dazu bräuchte man schon einen weiteren Descriptor, der einen value anstatt einen setter angibt.
Mathias
--
[Chaplin - An Application Architecture Using Backbone.js](https://github.com/chaplinjs/chaplin)