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