Skip to content

Commit

Permalink
update(JS): web/javascript/reference/global_objects/object/assign
Browse files Browse the repository at this point in the history
  • Loading branch information
undead404 authored and AdriandeCita committed Jul 17, 2022
1 parent 5693bb9 commit 4de0a6e
Showing 1 changed file with 25 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,17 @@ tags:
- Polyfill
browser-compat: javascript.builtins.Object.assign
---

{{JSRef}}

Метод **`Object.assign()`** (присвоїти) копіює всі {{jsxref("Object/propertyIsEnumerable", "перелічувані", "", 1)}} {{jsxref("Object/hasOwnProperty", "власні властивості", "", 1)}} від одного чи більше _донорських об'єктів_ до _цільового об'єкта_. Він повертає модифікований цільовий об'єкт.
Метод **`Object.assign()`** (присвоїти) копіює всі {{jsxref("Object/propertyIsEnumerable", "перелічувані", "", 1)}} {{jsxref("Object/hasOwn", "власні властивості", "", 1)}} від одного чи більше _донорських об'єктів_ до _цільового об'єкта_. Він повертає модифікований цільовий об'єкт.

{{EmbedInteractiveExample("pages/js/object-assign.html")}}

## Синтаксис

```js
Object.assign(target, ...sources)
Object.assign(target, ...sources);
```

### Параметри
Expand Down Expand Up @@ -67,7 +68,7 @@ console.log(copy); // { a: 1 }
function test() {
'use strict';

let obj1 = { a: 0 , b: { c: 0}};
let obj1 = { a: 0, b: { c: 0 } };
let obj2 = Object.assign({}, obj1);
console.log(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}}

Expand All @@ -84,7 +85,7 @@ function test() {
console.log(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 3}}

// Глибоке клонування
obj1 = { a: 0 , b: { c: 0}};
obj1 = { a: 0, b: { c: 0 } };
let obj3 = JSON.parse(JSON.stringify(obj1));
obj1.a = 4;
obj1.b.c = 4;
Expand All @@ -103,7 +104,7 @@ const o3 = { c: 3 };

const obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, цільовий об'єкт також змінився.
console.log(o1); // { a: 1, b: 2, c: 3 }, цільовий об'єкт також змінився.
```

### Злиття об'єктів з однаковими властивостями
Expand Down Expand Up @@ -133,15 +134,19 @@ Object.getOwnPropertySymbols(obj); // [Symbol(foo)]
### Неможливо скопіювати властивості в прототипному ланцюжку чи неперелічувані властивості

```js
const obj = Object.create({ foo: 1 }, { // foo знаходиться в прототипному ланцюжку obj
bar: {
value: 2 // bar не є перелічуваною властивістю
const obj = Object.create(
// foo знаходиться в прототипному ланцюжку obj
{ foo: 1 },
{
bar: {
value: 2, // bar не є перелічуваною властивістю
},
baz: {
value: 3,
enumerable: true, // baz є власною перелічуваною властивістю.
},
},
baz: {
value: 3,
enumerable: true // baz є власною перелічуваною властивістю.
}
});
);

const copy = Object.assign({}, obj);
console.log(copy); // { baz: 3 }
Expand All @@ -166,18 +171,18 @@ console.log(obj); // { "0": "a", "1": "b", "2": "c" }
```js
const target = Object.defineProperty({}, 'foo', {
value: 1,
writable: false
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.bar); // 2, властивості першого донора успішно скопійовано.
console.log(target.foo2); // 3, перша властивість другого донора скопійована успішно.
console.log(target.foo); // 1, тут викинуто виняток.
console.log(target.foo); // 1, тут викинуто виняток.
console.log(target.foo3); // undefined, робота методу "assign" завершилася, foo3 скопійовано не буде.
console.log(target.baz); // undefined, третій донор також копіюватися не буде.
console.log(target.baz); // undefined, третій донор також копіюватися не буде.
```

### Копіювання методів доступу
Expand All @@ -187,7 +192,7 @@ const obj = {
foo: 1,
get bar() {
return 2;
}
},
};

let copy = Object.assign({}, obj);
Expand All @@ -197,14 +202,14 @@ console.log(copy);

// Ось фінкція присвоєння, яка капіює дескриптори цілком
function completeAssign(target, ...sources) {
sources.forEach(source => {
sources.forEach((source) => {
let descriptors = Object.keys(source).reduce((descriptors, key) => {
descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
return descriptors;
}, {});

// Як усталено, Object.assign копіює також перелічувані символи
Object.getOwnPropertySymbols(source).forEach(sym => {
Object.getOwnPropertySymbols(source).forEach((sym) => {
let descriptor = Object.getOwnPropertyDescriptor(source, sym);
if (descriptor.enumerable) {
descriptors[sym] = descriptor;
Expand Down

0 comments on commit 4de0a6e

Please sign in to comment.