JavaScript prototype

JavaScript prototype
« kdy: 07. 03. 2022, 14:44:02 »
Zdravím,

učím se JS a chtěl bych vědět, jaký je rozdíl mezi

Kód: [Vybrat]
function Clovek(jmeno, vek){
    this.jmeno = jmeno;
    this.vek = vek;
}

Clovek.prototype.starne = function(roky){
    this.vek += roky;
}

var vezen1 = new Clovek("Karel", 32);
var vezen2 = new Clovek("Pepa", 22);

vezen1.starne(5);

a

Kód: [Vybrat]
function Clovek(jmeno, vek){
    this.jmeno = jmeno;
    this.vek = vek;
    this.starne = function(roky){
        this.vek += roky;
    }
}

var vezen1 = new Clovek("Karel", 32);
var vezen2 = new Clovek("Pepa", 22);

vezen1.starne(5);

Děkuji
« Poslední změna: 07. 03. 2022, 19:13:56 od Petr Krčmář »


fos4

Re:javascript prototype
« Odpověď #1 kdy: 07. 03. 2022, 15:42:23 »
V prvním případě je funkce sdílená napříč všemi instancemi (v prototypovém řetězci). V druhém případě se anonymní fce (uložená do proměnné starne) vytváří pokaždé znova.

Re:javascript prototype
« Odpověď #2 kdy: 07. 03. 2022, 17:04:01 »
V druhém případě má každá instance svou vlastní funkci starne(), teoreticky může být každá jiná. Třeba pokud by instance reprezentovala ženu, měla by svou vlastní funkci, která by přičítala jenom 2/3 uvedených let. V prvním případě je ta funkce uvedená přímo na prototypu tj. když se ta funkce nenajde přímo u instance, bude se hledat na prototypu – a tam už je jenom jedna, která bude pro všechny instance dělat to samé.

robin martinez

  • *****
  • 1 138
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Re:JavaScript prototype
« Odpověď #3 kdy: 08. 03. 2022, 06:26:58 »
tak ja to tu napisu jeste potreti:

v prvnim pripade:  :) :) :) :) :) - pouzivat

v druhym pripade:  >:( >:( >:( >:( - idealne nepouzivat.


V druhym pripade ma kazdy instancovany objekt taky vlastni instancovanou funkci, takze se zbytecne plytva pameti na necem, co by melo byt pro vsechny objekty stejne a na jednom miste, coz prave resi prvni pripad.

Ten d ruhy pripad se pouziva vylozene tam, kde vite, ze nebudete delat x stejnych objektu, ale bude vzdy jen jeden - ja to pouzival treba tam, kde byl jen jeden objekt, co nejakym zpusobem treba zpracovaval formular. Ale dnes bych to i tak napsal bud prototypem.

Jen dodam, ze nes uz se taky pouzivaji klasicky tridy (class) a ty vychazeji z prototypoveho vytvareni trid (to prvni).
« Poslední změna: 08. 03. 2022, 06:29:09 od robin martinez »
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:javascript prototype
« Odpověď #4 kdy: 08. 03. 2022, 08:35:10 »
V prvním případě je funkce sdílená napříč všemi instancemi
A hodí se dodat, že v moderním JS jsou i “normální” třídy (class), takže pokud člověk nechce, o prototypy se nemusí zajímat.


Re:javascript prototype
« Odpověď #5 kdy: 08. 03. 2022, 09:10:46 »
A hodí se dodat, že v moderním JS jsou i “normální” třídy (class), takže pokud člověk nechce, o prototypy se nemusí zajímat.
Jenže ty „normální“ třídy v JavaScriptu jsou pořád založené na prototypové dědičnosti.

takze se zbytecne plytva pameti na necem, co by melo byt pro vsechny objekty stejne a na jednom miste
Tohle bych vůbec neřešil. Dnešní JavaScriptové frameworky jsou založené na tom, že se stále dokola vytvářejí ty samé funkce, takže JavaScriptové enginy se s tím musí umět vypořádat a řešit to efektivně.

Jinak je to tak, že pokud k tomu autor nemá nějkaý speciální důvod, měla by se použít ta prnví varianta a prototypovou dědičností. Ale důvod k tomu není optimalizace, ale to, že je ta konstrukce k tomu určená a běžně se tak používá, takže ten kód je pak srozumitelnější.

robin martinez

  • *****
  • 1 138
  • Have you hugged your toilet today?
    • Zobrazit profil
    • Null Storage
    • E-mail
Re:javascript prototype
« Odpověď #6 kdy: 08. 03. 2022, 09:14:09 »

Tohle bych vůbec neřešil. Dnešní JavaScriptové frameworky jsou založené na tom, že se stále dokola vytvářejí ty samé funkce, takže JavaScriptové enginy se s tím musí umět vypořádat a řešit to efektivně.


To je pravda, v pripade od tazatele to je 'par bajtu' ale bylo by dobry, aby programator vedel, jak to funguje a snazil se to psat 'spravne' sam. Ale to se dostavame uz do tematu, kdy dnes programatory nic nezajima a jelikoz mame vsichni 16GB RAM, tak proc bychom na vsechno nekaslali.

A ano, ve finale to bude fungovat oboji a jestli programatora zajima/nezajima, ze se tam zbytecne generuji zbytecnosti, je uz vec druha
One machine can do the work of fifty ordinary men. No machine can do the work of one extraordinary man.

I do Linux, Hardware and spaghetti code in PHP, Python and JavaScript

Re:javascript prototype
« Odpověď #7 kdy: 08. 03. 2022, 09:51:15 »
To je pravda, v pripade od tazatele to je 'par bajtu' ale bylo by dobry, aby programator vedel, jak to funguje a snazil se to psat 'spravne' sam. Ale to se dostavame uz do tematu, kdy dnes programatory nic nezajima a jelikoz mame vsichni 16GB RAM, tak proc bychom na vsechno nekaslali.

A ano, ve finale to bude fungovat oboji a jestli programatora zajima/nezajima, ze se tam zbytecne generuji zbytecnosti, je uz vec druha
Ano, programátor se má snažit psát to správně. Ale správně je v tomto případě jednoznačně určené tím, jak se to používá, k čemu je to určené a co tedy bude čitelnější. Ušetřených pár bajtů reference rozhodně není ten důvod, proč to psát jinak – a naopak by to bylo špatně psát kód jinak kvůli pár bajtům, když vůbec nevíme, jestli to má nějaký vliv na výkon. Stejně důležité, jako vyhýbat se nesmyslně neefektivním konstrukcím, je vyhýbat se nesmyslným předčasným optimalizacím.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:javascript prototype
« Odpověď #8 kdy: 08. 03. 2022, 10:51:01 »
jelikoz mame vsichni 16GB RAM

ve finale to bude fungovat oboji a jestli programatora zajima/nezajima, ze se tam zbytecne generuji zbytecnosti, je uz vec druha
1. Já mám 64 GB RAM a stejně si občas stěžuju :) S jídlem roste chuť :)

2. Jenže “zbytečné generování zbytečností” je ve většině případů i například alokace na haldě v Javě, protože escape analýza by měla dát instanci v zájmu optimality na zásobník. A vůbec celý tracing GC “zbytečně” drží objekty v paměti moc dlouho atd. atd. Je to o prioritách.