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.