→
すべての列挙可能な自身のプロパティの値を、1つ以上のコピー元オブジェクトからコピー先オブジェクトにコピーします。
| target | コピー先オブジェクト ― ソースのプロパティを適用するもので、変更後に返されます。 |
|---|---|
| sources | コピー元オブジェクト ― 適用したいプロパティを含むオブジェクトです。 |
コピー先オブジェクトです。
コピー先オブジェクトのプロパティは、コピー元に同じキーのプロパティがあると上書きされます。より後のコピー元のプロパティが、より前のものを同様に上書きします。
Object.assign() メソッドは、コピー元オブジェクトから列挙可能(enumerable)かつ直接所有(own)のプロパティだけをコピー先オブジェクトにコピーします。この際、コピー元オブジェクトには [[Get]]、コピー先オブジェクトには [[Set]] を使いますので、ゲッターとセッターを呼び出すことになります。これはプロパティの代入(assign)であり、プロパティをコピーしたり新しく定義をしたりするのとは違います。そのため、コピー元にゲッターが存在する場合、新しいプロパティをプロトタイプにマージする用途には不適切でしょう。
プロパティ定義を(列挙可能(enumerable)属性も含めて)プロトタイプの中にコピーするには、このメソッドではなく Object.getOwnPropertyDescriptor() と Object.defineProperty() を使用してください。
String と Symbol の両方のプロパティがコピーされます。
エラーが発生した場合、例えばプロパティが書き込み不可の場合は、TypeError が発生しますが、エラーが発生する前にプロパティが追加される場合、target オブジェクトが変更されることがあります。
注釈: Object.assign() はコピー元の値が null や undefined でも例外を投げないことに注意して下さい。
const obj = { a: 1 };
const copy = Object.assign({}, obj);
D=copy; //={ a: 1 }
Object.assign() はプロパティの値をコピーするため、深い複製を行うには別な方法を使用する必要があります。
元の値がオブジェクトへの参照である場合、参照の値のみをコピーするからです。
function test() {
'use strict';
let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);
alert(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}}
obj1.a = 1;
alert(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}}
alert(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}}
obj2.a = 2;
alert(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}}
alert(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 0}}
obj2.b.c = 3;
alert(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 3}}
alert(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 3}}
// Deep Clone
obj1 = { a: 0 , b: { c: 0}};
let obj3 = JSON.parse(JSON.stringify(obj1));
obj1.a = 4;
obj1.b.c = 4;
alert(JSON.stringify(obj3)); // { "a": 0, "b": { "c": 0}}
}
test();
const o1 = { a: 1 };
const o2 = { b: 2 };
const o3 = { c: 3 };
const obj = Object.assign(o1, o2, o3);
D=obj; //={ a: 1, b: 2, c: 3 }
D=o1; //={ a: 1, b: 2, c: 3 }。コピー先オブジェクト自体が変化する
¶省く