Autor Zpráva
TomasJ
Profil
Zdravím, díval jsem se tady na diskusi, všiml jsem si u nejednoho vlákna funkce (jestli to je funkce) prototype. Mohl by mi někdo polopatě vysvětlit k čemu tohle je a k čemu je to dobré? Vím, teď se ptám jak 1. ročník ZŠ, ale co už semnou že? :) Předem vám všem děkuji :)
EDIT: Odborné terminologii moc nehovím, čili byl bych rád za hovorové pojmenovávání. Ještě jednou děkuji.
pcmanik
Profil
Pouzi google, a je to javascriptovy framework - co to znamena si tiez najdes na googli.
TomasJ
Profil
pcmanik:
S touhle odpovědí ses ani nemusel obtěžovat. Tady na djpw to používá každý zkušenější člověk, tzn., že ví k čemu tohle je. Ale děkuji ti, víc tu se tu asi stejně od nikoho nedozvím. Mýlil jsem se.
Joker
Profil
Prototype mohou být dvě různé věci, jednak je to JS framework, viz pcmanik

Druhá je zabudovaný atribut každého objektu.
Co nejjednodušeji vysvětleno, změnou prototypu jde měnit vlastnosti objektu jako takového, přes všechny instance.

Příklad:
var ia = new A; // instance nějakého objektu A
var ib = new A; // jiná instance objektu A
ia.atr = 5; // nastaví atribut atr pouze instanci ia, jiné instance ho mít nebudou
A.prototype.neco = 5; // nastaví atribut neco objektu A jako takovému, všechny instance, i budoucí, teď budou mít atribut neco s hodnotou 5

Takhle se dají objektům přidávat i funkčnost, jde tak rozšířit třeba i funkčnost zabudovaných objektů JS, jako třeba Date, Array apod.

edit, [#6] opraveno
TomasJ
Profil
Joker:
Aha, chápu-li to tedy dobře, proměnná ib bude mít též přiřazený atribut neco?
Děkuji za tvůj příspěvěk :)
_es
Profil
Joker:
ia.prototype.neco = 5;
Nie, správne to je:
A.prototype.neco = 5;
TomasJ
Profil
Pak bych tedy udělal:
var Obj = new ABC;
ABC.prototype.abeceda="abcd....wxyz";
alert(Obj.abeceda); //Tak by tohle vrátilo to "abcd....wxyz"?
_es
Profil
TomasJ:
Tak by tohle vrátilo to "abcd....wxyz"?
Bráni ti niečo si to overiť?
TomasJ
Profil
_es:
Ne nebrání, máš pravdu, učinil jsem tak a vrátilo mi to chybu že ABC není definováno.
Použil jsem jako objekt pole a šlo to. Díky.
Joker
Profil
_es:
No jasně, opraveno. A taky komentář za tím řádkem neodpovídal verzi, kterou jsem nakonec odeslal.

TomasJ:
Aha, chápu-li to tedy dobře, proměnná ib bude mít též přiřazený atribut neco?
Přesně tak.

Pak bych tedy udělal:

Ano, ale snad není problém si to přímo vyzkoušet.
Není na to dokonce potřeba žádná stránka, dá se zkoušet i v adresním řádku prohlížeče přes javascript:kód
Joker
Profil
TomasJ:
vrátilo mi to chybu že ABC není definováno
Jo, jasně, objekt ABC musí samozřejmě existovat.

Když se na začátek dá:
function ABC() {}
bude to fungovat.
TomasJ
Profil
Joker, _es:
Ano díky, paráda, už to chápu :)
_es
Profil
TomasJ:
Ako ti už napísal Joker ABC musí existovať a musí to byť funkcia. Podrobnosti si môžeš nájsť, ak v kóde klikneš na new.
Witiko
Profil
Viz tento příspěvek: http://diskuse.jakpsatweb.cz/?action=vthread&forum=8&topic=123551
TomasJ
Profil
Witiko:
Ano ten jsem již četl, ale nerozuměl jsem mu, dokud mi to _es s Jokerem nevysvětlili, přesto díky :)
Witiko
Profil
TomasJ:
Možná by stálo za to v takovém případě do daného tématu napsat s případnými otázkami. Takhle tu pak máme hromady topiců zabývajících se tím samým. ;)
joe
Profil
Můžete sem ještě někdo napsat, k čemu to je dobré? Nějak mě nenapadá nic, pro co by to bylo dobré a využil bych to.

Jak napsal Joker:
Takhle se dají objektům přidávat i funkčnost, jde tak rozšířit třeba i funkčnost zabudovaných objektů JS, jako třeba Date, Array apod.

To sice můžu, ale taky si můžu napsat funkci a dosazovat tam nějaké pole jako parametr.
TomasJ
Profil
Tak jsem zkoušel hrát si s tím prototype a udělal jsem si takovou funkci "na hraní", ale nelze ji využít tak, jak bych chtěl.
<script>
function Fc(text)
{
  Fc.prototype.find = function(srch){return text.indexOf(srch);}
  Fc.prototype.upper = function(){return text.toUpperCase();}
  Fc.prototype.lower = function(){return text.toLowerCase();}
  Fc.prototype.delChar = function(chr){return text.replace(chr,"");}
}
var My = new Fc("ahoj, tady je první výskyt písmena A");
alert(My.find("A"));
</script>

Script vypíše pozici písmene A.
Chci toto:
Vytvořím instanci: var My = new Fc();. Nechci zadávat new Fc("Ahoj"), ale jen new Fc(); a pak chci třeba vyalertovat první pozici písmena "A".
Použiji na to tedy find("A"), které jsem si vytvořil a chci to celé zadávat nějak takto:
alert(My("ahoj, tady je první výskyt písmena A").find("A"));
Jak musím funkci upravit, aby bylo možno takto zadávat text, se kterým se pracuje? Díval jsem se jak má Witiko ten Sexy Dollar a tam se používá třeba alert($("#element"));. Takhle chci ten parametr též zapisovat, bohužel nevím, jak tu funkci překopat. Víte někdo jak na to? (předpokládám, že ano)
_es
Profil
TomasJ:
Vytvořím instanci: var My = new Fc();
A na čo má tá „inštancia“ slúžiť?
Objekty v objektovom programovaní by mali niečo predstavovať, čo predstavuje objekt My?
Môžeš si pridať vlastnú funkciu do prototypu funkcie String, napríklad:
String.prototype.funkcia = function(argumenty){nejaký kód};
A potom môžeš volať tú fukciu priamo ako metódu textového reťazca: reťazec.funkcia(argumenty)
TomasJ
Profil
_es:
Díky za ujasnění jak se věci mají :)
A na čo má tá ‚inštancia‘ slúžiť?
Čistě pro "vědecké" výzkumy. Prostě abych mohl testovat, co jak funguje :).

[...]do prototypu funkcie String, napríklad:
To je to, co potřebuji, díky :)
Witiko
Profil
joe:
„Můžete sem ještě někdo napsat, k čemu to je dobré? Nějak mě nenapadá nic, pro co by to bylo dobré a využil bych to. “

Zrovna od tebe bych očekával, že budeš vidět výhody objektového programování oproti čistě funkcionálnímu. :-) Pomocí prototype si můžeš definovat veškeré atributy dostupné instanci objektu. Na rozdíl od ukázek, které dávají ostatní (rozšiřování globálních objektů) - což je skutečně jen otázka elegance zápisu (a hraní si tak trochu s ohněm), v případě tvorby vlastních "tříd" není moc jiný způsob, jak daného cíle dosáhnout.

Viz.:
function Baltík() {}
Baltík.prototype.popojdi = function() {}
Baltík.prototype.otočkaDoleva = function() {}
Baltík.prototype.otočkaDoprava = function() {}

var Baltíci = [];
for(var i = 0; i < 1000; i++) {
  Baltíci.push(new Baltík());
}

alert("Mám tisíc Baltíků!");


A je tu sice možnost opisu, která se občas používá, pokud člověk chce v těle konstruktoru definovat privátní proměnné a chce aby k nim metody instance měly přístup, nicméně s tím je tu takový menší problém:

function Baltík() {
  this.popojdi = function() {}
  this.otočkaDoleva = function() {}
  this.otočkaDoprava = function() {}
}

var Baltíci = [];
for(var i = 0; i < 1000; i++) {
  Baltíci.push(new Baltík());
}

alert("Mám tisíc Baltíků!");


A problém je následující - v případě prvním dojde k vytvoření funkce pouze jedné, jež je volána vždy s jiným kontextem. V případě druhém dojde k vytvoření 1000 rozdílných objektů anonymních funkcí. Rozdíl několika milisekund v exekuci a pouze o něco málo více alokované operační paměti, nicméně pokud člověk neví s kolika instancemi bude pracovat, jedná se o špatný návrh.

Tolik k prototype. Více česky třeba tady (Kapitola o dědičnosti).
joe
Profil
Witiko:
To není o rozdílu objektového a funkcionálního programování :-), u "klasických" jazyků to je jasné, tam se metody píšou přímo do třídy a stejně tak jsem to dělal i v JS (tvůj druhý kód), když jsem něco jednoduššího psal. Spíš jsem neřešil ten fakt, že čím víc instancí, tím víc těch anonymních funkcí.
Takže díky za vysvětlení. Článek z intervalu jsem kdysi četl (tam je to také napsané), ale co člověk nepoužívá, rychle zapomene...

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: