Rolf B: Javascript Objekt wird immer überschrieben

Beitrag lesen

problematische Seite

Hallo kai345,

newTableHeadinsObj = Object.create(objTableHeadings);

Ich bin nicht so sicher, ob das hier zielführend ist. Auf diesem Weg erzeugst Du ein leeres Objekt, das das objTableHeadings Objekt als Prototyp besitzt.

Das ist etwas anderes als eine Kopie. Die wird von Dedlfix' Beispiel erzeugt, setzt aber einen aktuellen Browser voraus (d.h. nicht den Internet Explorer). Dedlfix verwendet den ... Operator, der je nach Zusammenhang "Rest" oder "Spread" Operator genannt wird. Im vorliegenden Fall ist es "Spread" - ausbreiten. Die Eigenschaften von objTableHeadings werden innerhalb von { } "ausgebreitet", d.h. verteilt, was dazu führt, dass JavaScript das wie ein Objektliteral auffasst, wo jede einzelne Eigenschaft aus objTableHeadings im Objektliteral zugewiesen wird.

const foo = { a: 1, b: 2 };

const bar1 = { a: foo.a, b: foo.b },
      bar2 = { ...foo };

console.log(bar1.a, bar1.b);             // 1 2
console.log(bar1.hasOwnProperty("a"));   // true
console.log(bar1.hasOwnProperty("b"));   // true

console.log(bar2.a, bar2.b);             // 1 2
console.log(bar2.hasOwnProperty("a"));   // true
console.log(bar2.hasOwnProperty("b"));   // true

foo.a = 99;
console.log(bar1.a, bar2.a);             // 1 1

Das, was JavaScript bei bar1 und bar2 tut, ist exakt das gleiche. Die direkt in foo definierten Eigenschaften werden hergenommen und ins Objektliteral ausgebreitet. Deswegen gibt hasOwnProperty auch true aus.

Aber Object.create macht etwas anderes:

const foo = { a: 1, b: 2 };
const bar = Object.create(foo);

console.log(bar.a, bar.b);              // 1 2
console.log(bar.hasOwnProperty("a"));   // FALSE
console.log(bar.hasOwnProperty("b"));   // FALSE

foo.a = 77;
foo.b = 88;
bar.a = 44;
console.log(bar.a, bar.b);              // 44 88
console.log(bar.hasOwnProperty("a"));   // TRUE
console.log(bar.hasOwnProperty("b"));   // FALSE

Hier wird foo zum Prototypen für bar - die JavaScript-Grundlage für Objektvererbung. Das bedeutet: Wenn in bar eine Eigenschaft oder Methode gesucht wird, die in bar nicht existiert, schaut JavaScript in foo nach und holt sich den Wert von dort. Bei einer Zuweisung wird aber immer nach bar geschrieben. Deswegen gibt hasOwnProperty zunächst FALSE für a und b aus, und deswegen schlägt die Änderung an foo.b auf bar durch.

Rolf

--
sumpsi - posui - obstruxi