Baseline Widely available
ÐеÑод Object.assign()
иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°Ñений вÑеÑ
ÑобÑÑвеннÑÑ
пеÑеÑиÑлÑемÑÑ
ÑвойÑÑв из одного или более иÑÑ
однÑÑ
обÑекÑов в Ñелевой обÑекÑ. ÐоÑле копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð½ возвÑаÑÐ°ÐµÑ Ñелевой обÑекÑ.
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target);
// Expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget === target);
// Expected output: true
СинÑакÑиÑ
Object.assign(target, ...sources)ÐаÑамеÑÑÑ
target
Целевой обÑекÑ.
sources
ÐÑÑ Ð¾Ð´Ð½Ñе обÑекÑÑ.
ÐозвÑаÑаеÑÑÑ Ð¿Ð¾Ð»ÑÑивÑийÑÑ Ñелевой обÑекÑ.
ÐпиÑаниеÐеÑод Object.assign()
копиÑÑÐµÑ Ð¸Ð· иÑÑ
однÑÑ
обÑекÑов в Ñелевой обÑÐµÐºÑ ÑолÑко пеÑеÑиÑлÑемÑе и ÑобÑÑвеннÑе ÑвойÑÑва. Ðн иÑполÑзÑÐµÑ Ð²Ð½ÑÑÑенний меÑод [[Get]]
на иÑÑ
однÑÑ
обÑекÑаÑ
и внÑÑÑенний меÑод [[Set]]
на Ñелевом обÑекÑе, Ñак ÑÑо он Ñакже вÑзÑÐ²Ð°ÐµÑ Ð³ÐµÑÑеÑÑ Ð¸ ÑеÑÑеÑÑ. Ðменно поÑÑÐ¾Ð¼Ñ Ð¾Ð½ пÑиÑÐ²Ð°Ð¸Ð²Ð°ÐµÑ ÑвойÑÑва вмеÑÑо пÑоÑÑого копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²ÑÑ
ÑвойÑÑв. ÐÑо поведение Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ Ð¼ÐµÑод непÑигоднÑм Ð´Ð»Ñ Ð²Ð»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²ÑÑ
ÑвойÑÑв в пÑоÑоÑип, еÑли вливаемÑе иÑÑ
однÑе обÑекÑÑ ÑодеÑÐ¶Ð°Ñ Ð³ÐµÑÑеÑÑ. ÐмеÑÑо него Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² пÑоÑоÑÐ¸Ð¿Ñ Ð¾Ð¿Ñеделений ÑвойÑÑв, вклÑÑÐ°Ñ Ð¿Ñизнак иÑ
пеÑеÑиÑлÑемоÑÑи, ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Object.getOwnPropertyDescriptor()
и Object.defineProperty()
.
ÐопиÑÑÑÑÑÑ ÑвойÑÑва Ñипов как String
, Ñак и Symbol
.
Ð ÑлÑÑае Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¾Ñибки, напÑимеÑ, когда ÑвойÑÑво ÑвлÑеÑÑÑ Ð½ÐµÐ·Ð°Ð¿Ð¸ÑÑваемÑм, возбÑждаеÑÑÑ Ð¸ÑклÑÑение TypeError
, а Ñелевой обÑÐµÐºÑ target
оÑÑаÑÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñм.
ÐбÑаÑиÑе внимание, ÑÑо меÑод Object.assign()
не вÑкидÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑениÑ, еÑли в каÑеÑÑве иÑÑ
однÑÑ
знаÑений вÑÑÑÑпаÑÑ null
или undefined
.
var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
ÐÑимеÑ: ÑлиÑние обÑекÑов
var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, изменилÑÑ Ð¸ Ñам Ñелевой обÑекÑ.
ÐÑимеÑ: копиÑование ÑимволÑнÑÑ
ÑвойÑÑв
var o1 = { a: 1 };
var o2 = { [Symbol("foo")]: 2 };
var obj = Object.assign({}, o1, o2);
console.log(obj); // { a: 1, [Symbol("foo")]: 2 }
ÐÑимеÑ: наÑледÑемÑе и непеÑеÑиÑлÑемÑе ÑвойÑÑва не копиÑÑÑÑÑÑ
var obj = Object.create(
{ foo: 1 },
{
// foo ÑвлÑеÑÑÑ ÑнаÑледованнÑм ÑвойÑÑвом.
bar: {
value: 2, // bar ÑвлÑеÑÑÑ Ð½ÐµÐ¿ÐµÑеÑиÑлÑемÑм ÑвойÑÑвом.
},
baz: {
value: 3,
enumerable: true, // baz ÑвлÑеÑÑÑ ÑобÑÑвеннÑм пеÑеÑиÑлÑемÑм ÑвойÑÑвом.
},
},
);
var copy = Object.assign({}, obj);
console.log(copy); // { baz: 3 }
ÐÑимеÑ: пÑимиÑÐ¸Ð²Ñ Ð¾Ð±Ð¾ÑаÑиваÑÑÑÑ Ð² обÑекÑÑ
var v1 = "123";
var v2 = true;
var v3 = 10;
var v4 = Symbol("foo");
var obj = Object.assign({}, v1, null, v2, undefined, v3, v4);
// ÐÑимиÑÐ¸Ð²Ñ Ð±ÑдÑÑ Ð¾Ð±ÑÑнÑÑÑ, а null и undefined - пÑоигноÑиÑованÑ.
// ÐбÑаÑиÑе внимание, ÑÑо ÑобÑÑвеннÑе пеÑеÑиÑлÑемÑе ÑвойÑÑва Ð¸Ð¼ÐµÐµÑ ÑолÑко обÑÑÑка над ÑÑÑокой.
console.log(obj); // { "0": "1", "1": "2", "2": "3" }
ÐÑимеÑ: иÑклÑÑÐµÐ½Ð¸Ñ Ð¿ÑеÑÑваÑÑ ÑекÑÑÑÑ Ð·Ð°Ð´Ð°ÑÑ ÐºÐ¾Ð¿Ð¸ÑованиÑ
var target = Object.defineProperty({}, "foo", {
value: 1,
writable: false,
}); // target.foo ÑвлÑеÑÑÑ ÑвойÑÑвом ÑолÑко-длÑ-ÑÑениÑ
Object.assign(target, { bar: 2 }, { foo2: 3, foo: 3, foo3: 3 }, { baz: 4 });
// TypeError: "foo" is read-only
// ÐÑи пÑиÑваивании ÑвойÑÑÐ²Ñ target.foo вÑбÑаÑÑваеÑÑÑ Ð¸ÑклÑÑение
console.log(target.bar); // 2, пеÑвÑй иÑÑ
однÑй обÑÐµÐºÑ ÑÑпеÑно ÑкопиÑовалÑÑ.
console.log(target.foo2); // 3, пеÑвое ÑвойÑÑво вÑоÑого иÑÑ
одного обÑекÑа ÑÑпеÑно ÑкопиÑовалоÑÑ.
console.log(target.foo); // 1, здеÑÑ Ð±Ñло вÑбÑоÑено иÑклÑÑение.
console.log(target.foo3); // undefined, меÑод assign завеÑÑилÑÑ, ÑвойÑÑво foo3 не ÑкопиÑовалоÑÑ.
console.log(target.baz); // undefined, ÑÑеÑий иÑÑ
однÑй обÑÐµÐºÑ Ñак же не ÑкопиÑовалÑÑ.
ÐÑимеÑ: копиÑование меÑодов доÑÑÑпа
var obj = {
foo: 1,
get bar() {
return 2;
},
};
var copy = Object.assign({}, obj);
console.log(copy);
// { foo: 1, bar: 2 }, знаÑением ÑвойÑÑва copy.bar ÑвлÑеÑÑÑ Ð·Ð½Ð°Ñение, возвÑаÑаемое геÑÑеÑом obj.bar.
// Такой ваÑÐ¸Ð°Ð½Ñ ÑÑнкÑии пÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÐºÐ¾Ð¿Ð¸ÑоваÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа.
function myAssign(target, ...sources) {
sources.forEach((source) => {
Object.defineProperties(
target,
Object.keys(source).reduce((descriptors, key) => {
descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
return descriptors;
}, {}),
);
});
return target;
}
var copy = myAssign({}, obj);
console.log(copy);
// { foo:1, get bar() { return 2 } }
ÐолиÑил
ÐÑÐ¾Ñ Ð¿Ð¾Ð»Ð¸Ñил не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑимволÑнÑе ÑвойÑÑва, поÑколÑÐºÑ ES5 вÑÑ Ñавно не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑимволÑ:
if (!Object.assign) {
Object.defineProperty(Object, "assign", {
enumerable: false,
configurable: true,
writable: true,
value: function (target, firstSource) {
"use strict";
if (target === undefined || target === null) {
throw new TypeError("Cannot convert first argument to object");
}
var to = Object(target);
for (var i = 1; i < arguments.length; i++) {
var nextSource = arguments[i];
if (nextSource === undefined || nextSource === null) {
continue;
}
var keysArray = Object.keys(Object(nextSource));
for (
var nextIndex = 0, len = keysArray.length;
nextIndex < len;
nextIndex++
) {
var nextKey = keysArray[nextIndex];
var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
if (desc !== undefined && desc.enumerable) {
to[nextKey] = nextSource[nextKey];
}
}
}
return to;
},
});
}
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4