Obejct.assign.apply Co powoduje?

0
var sources = [{a: "A"}, {b: "B"}, {c: "C"}];
options = Object.assign.apply(Object, [{}, {cz:"true"}].concat(sources));


Mam pytnie, bo nie rozumiem tutaj czegoś. Mianowicie, kiedy wywołamy metodę apply z this ustawionym na Object to puste obiekty się usuwają. Dlaczego tak się dzieje?

2

kiedy wywołamy metodę apply z this ustawionym na Object

Nie tu jest problem. To nie ma nic do rzeczy. I tak by this byłby ustawiony na Object, nawet jakbyś napisał Object.assign(.........), czyli wywołałbyś metodę obiektu Object.
(swoją drogą nie wiem, czy to ma znaczenie w tym przypadku, bo Object.assign.apply(null, .......... również działa).

No ale nie tu jest problem w tym przypadku.

puste obiekty się usuwają

Nie usuwają się. Napisałeś coś, co efektywnie wygląda mniej więcej tak:

options = Object.assign({}, {cz:"true"}, {a: "A"}, {b: "B"}, {c: "C"});

Czyli ten pusty obiekt to obiekt docelowy, do którego będzie kopiować kolejne właściwości. I on się nie usuwa, a zwraca ci ten obiekt właśnie. Weź zobacz:

var sources = [{a: "A"}, {b: "B"}, {c: "C"}];
var destination = {};
var options = Object.assign.apply(Object, [destination, {cz:"true"}].concat(sources));
console.log(destination === options); // true
0

options = Object.assign.apply(Object, [{}, {cz:"true"}, {}, {}].concat(sources));
powyżej, chodzi o to że te obiekty puste zostały wchłonięte do obiektu pierwszego(jedynego)?

teraz i się pomieszało bo przecież Object.assign przyjmuje 2 argumenty, cel, i żródło. Jeśli wywołuje metodę apply, to pierwszy jest argumentem Object, this, null, itp.
Natomiast 2 argument to tablica agrumentów przekazywanych do funkcji assign. Hmmm

ale teraz :bez wywołania apply to :

var destination = {};
var options = Object.assign( [destination].concat(sources));
//destination === {}
Dlaczergo inaczej ta funkcja się zachowuje bez wywołania apply

1

bo przecież Object.assign przyjmuje 2 argumenty

Nieprawda: https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/Object/assign.

0
bartek164 napisał(a):

options = Object.assign.apply(Object, [{}, {cz:"true"}, {}, {}].concat(sources));
powyżej, chodzi o to że te obiekty puste zostały wchłonięte do obiektu pierwszego(jedynego)?

Odnosiłem się do przykładu z pierwszego posta. A tam był tylko jeden (ten pierwszy) pusty obiekt.

Jeśli chodzi o ten przypadek:

Object.assign.apply(Object, [{}, {cz:"true"}, {}, {}].concat(sources));

To tu się nie ma co dziać. Po prostu puste obiekty {} nie posiadają właściwości, które Object.assign mógłby przekopiować*

*tj. pusty obiekt też niby jakieś właściwości posiada domyślnie, choćby odziedziczone metody typu toString, ale Object.assign olewa takie właściwości, bo Metoda Object.assign() jedynie kopiuje wyliczalne i własne właściwości z obiektów źródłowych do obiektu docelowego. Więc tutaj nic się nie powinno dziać raczej. Po prostu {} jest potraktowany jak pusty obiekt, z którego nie ma jak pobrać właściwości. Nic nie zostaje wchłonięte, bo nie ma co wchłaniać.

Object.assign kopiuje poszczególne właściwości obiektów(dokonuje płytkiej kopii), a nie same obiekty.

teraz i się pomieszało bo przecież Object.assign przyjmuje 2 argumenty, cel, i żródło. Jeśli wywołuje metodę apply, to pierwszy jest argumentem Object, this, null, itp.
Natomiast 2 argument to tablica agrumentów przekazywanych do funkcji assign. Hmmm

w przypadku wątpliwości:

  • MDN (nie tylko do Object.assign, ale też ogólnie jak masz wątpliwości co do działania poszczególnych elementów języka). W każdym razie jak nie jesteś pewien, jakie która funkcja ma parametry, to zaglądasz do MDN.
  • można też odpalić konsolę i posprawdzać wszystko interaktywnie (czyli np. powkładać coś do zmiennej, i zobaczyć co jest w zmiennej), żeby nie mieć wątpliwości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1