Obejct.assign.apply Co powoduje?

Obejct.assign.apply Co powoduje?
bartek164
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:534
0
Kopiuj
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?

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:36 minut
  • Postów:8422
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:

Kopiuj
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:

Kopiuj
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

edytowany 4x, ostatnio: LukeJL
bartek164
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad rok
  • Postów:534
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

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

bo przecież Object.assign przyjmuje 2 argumenty

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


edytowany 1x, ostatnio: Patryk27
Zobacz pozostały 1 komentarz
Patryk27
(...) kopiuje wszystkie wyliczalne własne właściwości *z jednego lub więcej* obiektów źródłowych do obiektu docelowego. W sekcji składnia masz też wprost napisane: ...zrodla.
bartek164
Object.assign(cel, ...zrodla) --> cel, żródło -2 agrumenty
bartek164
Ja se ten kod sprawdze jak wygląda, jak się będzie dało.Bez 2 argurntu, nic nie kopiuje tylko zwraca referencje do przekaznego obiektu.
Patryk27
Jest napisane źródła, nie źródło. W liczbie mnogiej, ponieważ możesz mieć wiele źródeł, a nie tylko jedno.
bartek164
aarrraharhahrarr arrar nie wiem o co CI ochodzi... tak wiem, ale jeszcze jest cel i żródła, razem 2 argumrnty.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:36 minut
  • Postów:8422
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.

edytowany 1x, ostatnio: LukeJL

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.