→
すべての列挙可能な自身のプロパティの値を、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 }。コピー先オブジェクト自体が変化する
¶省く