JavaScript

Object.assign()メソッド

 編集:2022.07.28 by T.A.

すべての列挙可能な自身のプロパティの値を、1つ以上のコピー元オブジェクトからコピー先オブジェクトにコピーします。

Object.assign(target, ...sources)
target コピー先オブジェクト ― ソースのプロパティを適用するもので、変更後に返されます。
sources コピー元オブジェクト ― 適用したいプロパティを含むオブジェクトです。
戻り値

コピー先オブジェクトです。

解説

コピー先オブジェクトのプロパティは、コピー元に同じキーのプロパティがあると上書きされます。より後のコピー元のプロパティが、より前のものを同様に上書きします。

Object.assign() メソッドは、コピー元オブジェクトから列挙可能(enumerable)かつ直接所有(own)のプロパティだけをコピー先オブジェクトにコピーします。この際、コピー元オブジェクトには [[Get]]、コピー先オブジェクトには [[Set]] を使いますので、ゲッターとセッターを呼び出すことになります。これはプロパティの代入(assign)であり、プロパティをコピーしたり新しく定義をしたりするのとは違います。そのため、コピー元にゲッターが存在する場合、新しいプロパティをプロトタイプにマージする用途には不適切でしょう。

プロパティ定義を(列挙可能(enumerable)属性も含めて)プロトタイプの中にコピーするには、このメソッドではなく Object.getOwnPropertyDescriptor()Object.defineProperty() を使用してください。

StringSymbol の両方のプロパティがコピーされます。

エラーが発生した場合、例えばプロパティが書き込み不可の場合は、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 }。コピー先オブジェクト自体が変化する

¶省く


テスト