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) // 报错
非オブジェクトは、ソースオブジェクト(すなわち、非最初のパラメータ)の位置に表示された場合、処理ルールが異なっています。まず、これらのパラメータは、あなたがオブジェクトに回すことができない場合は、スキップされ、オブジェクトに変わります。この手段であればそれundefined
とnull
ではない最初のパラメータでは、エラーがないでしょう。
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" }
上記のコードでは、v1
、v2
、v3
それぞれ、のみ(文字の配列の形で)ターゲット・オブジェクトに文字列の文字列、ブール値、および結果は、数値およびブール値は無視されます。文字列だけラップされたオブジェクトは、列挙プロパティを生成するためです。
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
上記のコードでは、ソース・オブジェクトobj1
のa
属性の値は、オブジェクトである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.assign
0,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
方法DEFAULTS
とoptions
の両方、同じ名前の属性を持っている場合は、新しいオブジェクトに結合option
属性値が上書きされますDEFAULTS
属性値を。
浅いコピー問題の存在に、という注意DEFAULTS
オブジェクトとoptions
オブジェクトのすべての属性、好ましくは、シンプルなタイプが別のオブジェクトを指していません。それ以外の場合は、DEFAULTS
オブジェクトのプロパティは無効である可能性が高いです。
const DEFAULTS = {
url: { host: 'example.com', port: 7070 }, }; processContent({ url: {port: 8000} }) // { // url: {port: 8000} // }
上記のコードの本来の意図をされてurl.port
8000に変更し、url.host
変更されません。実際の結果がoptions.url
上書きされDEFAULTS.url
、それはurl.host
存在しません。
著者:貧しい古い男ハンサムなドロップ
リンクします。https://www.jianshu.com/p/d5f572dd3776
出典:ジェーンの本は
、著者が著作権を保有しています。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。