Object.assignは()オブジェクトのコピー

Object.assignオブジェクトをマージするための方法は、全ての列挙属性のソースオブジェクト(ソース)は、対象物(ターゲット)にコピーします。

const target = { a: 1 }; const source1 = { b: 2 }; const source2 = { c: 3 }; Object.assign(target, source1, source2); target // {a:1, b:2, c:3} 

Object.assign最初のパラメータは、ソース・オブジェクトのパラメータが後ろにあり、ターゲット・オブジェクトのメソッドです。

ソースオブジェクトとターゲットオブジェクトは、以前の属性上書き属性後、同じ名前の属性、または同じname属性のソースオブジェクトを複数有している場合ことに留意されたいです。

const target = { a: 1, b: 1 }; const source1 = { b: 2, c: 2 }; const source2 = { c: 3 }; Object.assign(target, source1, source2); target // {a:1, b:2, c:3} 

唯一つのパラメータ場合は、Object.assignパラメータに直接戻ります。

const obj = {a: 1}; Object.assign(obj) === obj // true 

このパラメータがオブジェクトでない場合は、それが第一の目的に変身してから返します。

typeof Object.assign(2) // "object" 

そのためundefined、およびnullそれらをパラメータとして使用されているそうだとすれば、対象物に変わりはない、エラーが報告されています。

Object.assign(undefined) // 报错 Object.assign(null) // 报错 

非オブジェクトは、ソースオブジェクト(すなわち、非最初のパラメータ)の位置に表示された場合、処理ルールが異なっています。まず、これらのパラメータは、あなたがオブジェクトに回すことができない場合は、スキップされ、オブジェクトに変わります。この手段であればそれundefinednullではない最初のパラメータでは、エラーがないでしょう。

let obj = {a: 1}; Object.assign(obj, undefined) === obj // true Object.assign(obj, null) === obj // true 

他のタイプの値(即ち、値、およびブール列)最初のパラメータではないが与えられていません。しかし、ターゲットオブジェクトにコピーされた文字列の配列に加えて、他の値が有効でないであろう。

const v1 = 'abc';
const v2 = true; const v3 = 10; const obj = Object.assign({}, v1, v2, v3); console.log(obj); // { "0": "a", "1": "b", "2": "c" } 

上記のコードでは、v1v2v3それぞれ、のみ(文字の配列の形で)ターゲット・オブジェクトに文字列の文字列、ブール値、および結果は、数値およびブール値は無視されます。文字列だけラップされたオブジェクトは、列挙プロパティを生成するためです。

Object(true) // {[[PrimitiveValue]]: true} Object(10) // {[[PrimitiveValue]]: 10} Object('abc') // {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"} 

上記のコードでは、元の値にブール値、数値、文字列、及びラップさに対応するオブジェクトにトランスフェクションは、パッケージオブジェクト内のプロパティで見ることができる[[PrimitiveValue]]上、このプロパティはされないObject.assignコピー。ラッパーのみオブジェクトの文字列は、本当の意味列挙可能な特性を持つことになり、これらのプロパティがコピーされます。

Object.assignプロパティのコピーは、ソースオブジェクト(継承された属性をコピーしない)の自分の財産のコピーだけを制限され、またコピーが属性を(列挙することはできませんenumerable: false)。

Object.assign({b: 'c'}, Object.defineProperty({}, 'invisible', { enumerable: false, value: 'hello' }) ) // { b: 'c' } 

上記のコードでは、Object.assign唯一の非列挙型属性をコピーするオブジェクトはinvisible、このプロパティはにコピーされていません。

シンボル値という名前のプロパティは、となりますObject.assignコピー。

Object.assign({ a: 'b' }, { [Symbol('c')]: 'd' }) // { a: 'b', Symbol(c): 'd' } 

注意点

(1)浅いコピー

Object.assignこの方法ではなく、深いコピーよりも、簡易コピーを実践されています。つまり、ソースオブジェクトがオブジェクトである場合、プロパティの値は、ターゲットオブジェクトのコピーが、オブジェクトへの参照になってしまいます。

const obj1 = {a: {b: 1}}; const obj2 = Object.assign({}, obj1); obj1.a.b = 2; obj2.a.b // 2 

上記のコードでは、ソース・オブジェクトobj1a属性の値は、オブジェクトであるObject.assign得られたコピーはオブジェクトへの参照です。このオブジェクトの変更は、宛先オブジェクトに反映されます。

同じname属性の(2)の交換

このネストされたオブジェクトの場合、同じ名前のイベント属性は、Object.assign処理方法ではなく追加するよりも、交換することです。

const target = { a: { b: 'c', d: 'e' } } const source = { a: { b: 'hello' } } Object.assign(target, source) // { a: { b: 'hello' } } 

上記のコードは、targetオブジェクトのa属性はsource、オブジェクトaを取得しないが、置換全体の特性{ a: { b: 'hello', d: 'e' } }結果を。これにより、開発者は、欲しい特別なケアを必要としない通常です。

いくつかのライブラリが提供するObject.assign(例えばLodashのようなカスタマイズされたバージョンの_.defaultsDeepディープコピーを得ることができる方法を)。

(3)処理アレイ

Object.assignアレイを処理するために使用することができるが、アレイは、オブジェクトとして扱われます。

Object.assign([1, 2, 3], [4, 5]) // [4, 5, 3] 

上記のコードでは、Object.assign0,1,2という名前のオブジェクトのプロパティとして配列は、ソース配列プロパティ0は4、標的配列の0性質をカバー1

工程(4)関数の値

Object.assignその後、評価され、その後、コピー、値のみをコピーし、あなたが値をコピーしたい場合は、値の関数です。

const source = {
  get foo() { return 1 } }; const target = {}; Object.assign(target, source) // { foo: 1 } 

上記のコードは、sourceオブジェクトのfoo属性値は、関数でObject.assign、過去にこの値をコピーして、値を取得するだけで、後に、関数の値をコピーしません。

一般的な用途

Object.assign便利な多くの方法があります。

(1)目的のために添加しました

class Point {
  constructor(x, y) { Object.assign(this, {x, y}); } } 

上記プロセスによってObject.assign方法、x特性及びyに属性を追加するPointオブジェクト・クラスのインスタンス。

(2)オブジェクトを追加する方法

Object.assign(SomeClass.prototype, { someMethod(arg1, arg2) { ··· }, anotherMethod() { ··· } }); // 等同于下面的写法 SomeClass.prototype.someMethod = function (arg1, arg2) { ··· }; SomeClass.prototype.anotherMethod = function () { ··· }; 

上記のコードは、括弧内に直接、二つの機能をオブジェクトのプロパティの簡単な表現を使用し、その後、使用assignする方法をSomeClass.prototypeされています。

オブジェクトの(3)のクローニング

function clone(origin) { return Object.assign({}, origin); } 

上記目的は、元のコードにコピーされている空のオブジェクトであり、元のオブジェクトのクローンを得ます。

しかし、この方法でクローンを、元のオブジェクト値自体の唯一のクローンは、それが継承された値をクローン化することができません。あなたが継承チェーンを維持したい場合は、次のコードを使用することができます。

function clone(origin) { let originProto = Object.getPrototypeOf(origin); return Object.assign(Object.create(originProto), origin); } 

(4)複数のオブジェクトを組み合わせます

オブジェクトに複数のオブジェクトを結合します。

const merge = (target, ...sources) => Object.assign(target, ...sources); 

あなたは新しいオブジェクトを返すように統合したい場合は、上記の関数、合併への空のオブジェクトを書き換えることができます。

const merge = (...sources) => Object.assign({}, ...sources); 

属性のデフォルト値に指定した(5)

const DEFAULTS = {
  logLevel: 0, outputFormat: 'html' }; function processContent(options) { options = Object.assign({}, DEFAULTS, options); console.log(options); // ... } 

上記のコードは、DEFAULTSオブジェクトはデフォルトでoptionsオブジェクトがユーザ指定のパラメータです。Object.assign方法DEFAULTSoptionsの両方、同じ名前の属性を持っている場合は、新しいオブジェクトに結合option属性値が上書きされますDEFAULTS属性値を。

浅いコピー問題の存在に、という注意DEFAULTSオブジェクトとoptionsオブジェクトのすべての属性、好ましくは、シンプルなタイプが別のオブジェクトを指していません。それ以外の場合は、DEFAULTSオブジェクトのプロパティは無効である可能性が高いです。

const DEFAULTS = {
  url: { host: 'example.com', port: 7070 }, }; processContent({ url: {port: 8000} }) // { // url: {port: 8000} // } 

上記のコードの本来の意図をされてurl.port8000に変更し、url.host変更されません。実際の結果がoptions.url上書きされDEFAULTS.url、それはurl.host存在しません。



著者:貧しい古い男ハンサムなドロップ
リンクします。https://www.jianshu.com/p/d5f572dd3776
出典:ジェーンの本は
、著者が著作権を保有しています。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。

おすすめ

転載: www.cnblogs.com/xiaoxiaoxun/p/12157591.html