Autor Zpráva
KryVosa
Profil
Dobrý den, mám zde další ze svých koumavých dotazů:
Chtěl bych nějak na prototyp pole navěsit, že když ho operátorem sčítání sečtete s jiným, sečtou se spolu jejich prvky:
[0,5]+[4,5]==[4,10] //true
Jde to nějak?
PS: Já vím, můžu si udělat funkci funkce([0,5],[4.5]), ale jde mi o jednoduchost použití a čitelnost kódu.
_es
Profil
KryVosa:
Jde to nějak?
Nejde. Môžeš si napríklad do prototypu pridať nejakú vlastnú metódu a potom používať:
pole3 = pole1.metóda(pole2)
Radek9
Profil
KryVosa:
V JS moc dobře nejde přetěžovat operátory (narozdíl třeba od C++). Pro aritmetické operace se na objektech volá metoda valueOf a s jejím výsledkem se potom pracuje. Jak radí _es, můžeš si udělat custom metodu na prototypu, nebo prostě použít existující metody jako např. map:
array1.map(function (val, key) { return val + array2[key]; })

S použitím arrow funkce je to o kousek kratší:
array1.map((val, key) => val + array2[key])
KryVosa
Profil
A všech výše zmíněných možnostech vím, zajímalo mě právě ono přetěžování operátorů. Každopádně děkuji.
Radek9
Profil
KryVosa:
U dynamicky typovaných jazyků by to byla trochu dvojsečná zbraň. Na jednu stranu by bylo fajn něco takového mít, ale na druhou stranu by to znamenalo hodně runtime checků, což může být dost drahé. U staticky typovaných jazyků (jako např. zmíněné C++) je to jednoduché. Tam se to prostě převede na volání příslušné funkce už pri kompilaci.

Pokud tě to zajímá, tak v JS existuje ne úplně dobře podporovaný objekt Proxy, který dovoluje určitým způsobem přetížit aspoň nějaké operátory a volání nativních funkcí.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: