Autor | Zpráva | ||
---|---|---|---|
vojja01 Profil * |
#1 · Zasláno: 23. 9. 2013, 20:30:44
Dobrý den,
V javascriptu programuji relativně nově a potřebuji napsat kostru objektu. Je to poměrně jednoduché, vytvořím instanci s jedním parametrem a potom využívám růzdné metody tento parametr využívající. Bohužel po všech článcích, které jsem přečetl a příkladech, které jsem projel, se mi pořád nedaří a stále narážím na nějaké banální chyby. V javascriptu je to oproti třeba PHP složitější, co jsem se dočetl, i podle zkušenosti. Neporadil by mi někdo? :) Předem díky. |
||
Chamurappi Profil |
#2 · Zasláno: 23. 9. 2013, 20:38:34
Reaguji na vojju01:
„Neporadil by mi někdo? :)“ Určitě poradil, ale musíš upřesnit, co vlastně chceš vědět. |
||
vojja01 Profil * |
#3 · Zasláno: 23. 9. 2013, 20:39:14
Úplně základní syntaxi :)
|
||
_es Profil |
#4 · Zasláno: 23. 9. 2013, 20:39:25
vojja01:
Nenapísal si, čomu konkrétnemu nerozumieš. Nejaké výukové materiály do tohoto vlákna ti tu asi nikto prepisovať či kopírovať nebude. |
||
juriad Profil |
#5 · Zasláno: 23. 9. 2013, 20:40:58
Ukaž třeba kus kódu, který ti nefunguje. Nejspíš se dočkáš seznamu chyb a zůsobu jejich řešení.
|
||
vojja01 Profil * |
#6 · Zasláno: 23. 9. 2013, 20:41:17
Výukové materiály jsem studoval, úplně hned bych sem nepsal, ale každý píše nějaký jiný způsob psaní těch objektů.
|
||
_es Profil |
#7 · Zasláno: 23. 9. 2013, 20:45:53
vojja01:
„každý píše nějaký jiný způsob psaní těch objektů.“ No tak je veľa spôsobov, použiješ spôsob, ktorý si myslíš, že je na konkrétny účel vhodný. V JS to je niekedy také „kostrbaté“ voči niektorým iným jazykom. Ktorému konkrétnemu „spôsobu písania“ nerozumieš? |
||
vojja01 Profil * |
#8 · Zasláno: 23. 9. 2013, 20:48:26 · Upravil/a: vojja01
třeba:
function App(dia) { unLoad = function() { skrytDialog(dia); } } var facebook = new App("facebook"); facebook.unLoad(); //vypíše facebook.unLoad is not a function Právě, nevím, který je vhodný a ani jim všem pořádně nerozumím. |
||
Someone Profil |
#9 · Zasláno: 23. 9. 2013, 20:54:32
function App(dia) { this.unLoad = function() { skrytDialog(dia); } } |
||
vojja01 Profil * |
#10 · Zasláno: 23. 9. 2013, 20:57:32
Aha, děkuji, to funguje. Pamatuju si, že když jsem tam to this psal, házelo to další chyby. Tak teď snad nebudou problémy..
|
||
Chamurappi Profil |
#11 · Zasláno: 23. 9. 2013, 21:08:06
Reaguji na vojju01:
V otázkách OOP v JS jsem si stále trochu nejistý, ale dobře, někdy to popsat musím… Konstruktor je libovolná funkce. V this je při jeho jejím zavolání s operátorem new na začátku prázdný objekt, který má interně uloženo, že je instancí konstruktoru. Metody na instancích můžeš vytvářet dvěma způsoby:
1) Přímo v konstruktoru, tak, že přiřadíš funkci do this.jménoMetody . Výhodou je, že tato funkce vidí na argumenty konstruktoru a i na jiné lokální (chceš-li privátní) proměnné a funkce, které jsou definované uvnitř konstruktoru. Nevýhodou je, že se při každém vytváření instance vytváří všechny metody znovu.
2) Navěšením na prototype , tedy tak, že přiřadíš funkci do Konstruktor.prototype.jménoMetody . Výhodou je, že tato funkce je pak společná pro všechny instance. Nevýhodou, že nemá žádný exkluzivní přístup k objektu, tzn. může pracovat jen s veřejně dostupnými členy, stejně jako jakákoliv cizí funkce, které se dostane instance objektu do spárů.
Metody vidí v this objekt, na němž jsou vyvolávané, což nemusí být nutně ten, na kterém jsou definované (lze je tedy přenášet mezi objekty). Viz Co znamená a jak se používá v JavaScriptu this?
Konstruktor může obsahovat return vracející objekt (jakýkoliv neprimitivní typ), v takovém případě je výsledkem konstruování tento náhradní objekt.
Zapomněl jsem na něco? |
||
_es Profil |
#12 · Zasláno: 23. 9. 2013, 21:52:22
Chamurappi:
„Zapomněl jsem na něco?“ „Reťazenie“ prototypov, nové možnosti práce s objektami z ECMAScript5,... To by už z toho bola asi kapitola učebnice. V niektorej literatúre z toho robia takú „vedu“ že sa toho chudák začiatočník môže až zľaknúť. |
||
pako Profil * |
#13 · Zasláno: 23. 9. 2013, 22:59:55
[#12] _es:
Ked som sa prvykrat dostal k dedicnosti tak som tu kapitolu naozaj preskocil ;) [#11] Chamurappi: Konstruktor může obsahovat return vracející objekt (jakýkoliv neprimitivní typ), v takovém případě je výsledkem konstruování tento náhradní objekt. Len dodam, ze v tomto pripade sa neda vyuzit prototyp konstruktora, kedze pri vrateni ineho objektu, ako toho, ktory sa vytvori implicitne, neexistuje vazba medzi prototypom konstruktora a vratenym objektom. |
||
_es Profil |
#14 · Zasláno: 23. 9. 2013, 23:29:49
pako:
„v tomto pripade sa neda vyuzit prototyp konstruktora“ Ale teoreticky sa môže vrátiť aj objekt, kde bude ten prototyp konštruktora v postupnosti prototypov vráteného objektu. |
||
Chamurappi Profil |
#15 · Zasláno: 23. 9. 2013, 23:38:32
Reaguji na _es:
„‚Reťazenie‘ prototypov“ To prakticky znamená, že do vlastnosti prototype přiřadím nějaký jiný objekt, ale jinak je ta logika vlastně pořád stejná, ne? Všechno, co je v prototype , je automaticky vtisknuto do vytvářeného objektu a je jedno, jestli je to jedna metoda, nebo shluk všelijakých jiných členů (tedy objekt). Když dám do prototype instanci nějakého objektu, tak jeho konstruktor zase může mít svůj prototype atd., v tom už žádná hlubší věda není. Žádné další speciální pravidlo. (Akorát teda instanceof dokáže proplout skrz neviditelné názvy konstruktorů všech zahnízděných prototypů, to trochu speciální je.)
„V niektorej literatúre z toho robia takú ‚vedu‘ že sa toho chudák začiatočník môže až zľaknúť.“ Nejen začátečník :-) Myslím, že hodně učebnic dělá chybu, že kouká na prototypové OOP očima třídního OOP a snaží se v něm vidět podobnosti a spíš porovnávat oba přístupy, místo toho, aby popsaly prototypové OOP od nuly. Reaguji na paka: Dobrá připomínka. |
||
Jan Tvrdík Profil |
#16 · Zasláno: 23. 9. 2013, 23:39:28
vojja01:
Jsi-li schopen číst technickou angličtinu, tak doporučuji článek sporto.github.io/blog/2013/02/22/a-plain-english-guide-to-javascript-prototypes. |
||
_es Profil |
#17 · Zasláno: 24. 9. 2013, 00:27:35
Chamurappi:
„Akorát teda instanceof dokáže proplout skrz neviditelné názvy konstruktorů všech zahnízděných prototypů, to trochu speciální je.“
„Preplavuje“ sa to aj pri obyčajnom čítaní nejakej vlastnosti, postupne sa prehľadávajú všetky prototypy objektu na názov vlastnosti, nie len pri operátore instanceof .
„hodně učebnic dělá chybu, že kouká na prototypové OOP očima třídního OOP a snaží se v něm vidět podobnosti“ Píše sa tam o „triedach“, „privátnych vlastnostiach“, ... a chudák čitateľ vidí v kóde len funkcie, obyčajné premenné, ... |
||
pako Profil * |
#18 · Zasláno: 24. 9. 2013, 12:01:48
[#14] _es:
To ma vobec nenapadlo, uvazoval som pripad objektu tvoreneho ako literal alebo new Object . Pre zaujimavost prikladam riesenie, ktore som nakoniec vytvoril, aj ked tu nevidim ziaden prakticky prinos.
function inherit(o) { function F() {} F.prototype = o; return new F(); } function P(name) { var o = inherit(P.prototype); o.name = name; return o; } P.prototype.say = function() {return this.name;}; var obj = new P('pako'); console.log(obj instanceof P); // true console.log(obj.say()); // 'pako' |
||
1Pupik1989 Profil |
#19 · Zasláno: 25. 9. 2013, 10:27:00
Zbytečné předávat prototype v konstruktoru.
function inherit(o) { function F() {} F.prototype = o; return new F(); }; function People(){}; People.prototype.name = 'anonymous'; function Person(name,sex) { this.name = name || this.name; this.sex = sex || this.sex; return this; }; Person.prototype = inherit(People.prototype); Person.prototype.sayName = function() {return this.name;}; var obj = new Person('pako'); console.log(obj instanceof Person); // true console.log(obj instanceof People); // true console.log(obj.sayName()); // 'pako' obj = new Person(); console.log(obj instanceof Person); // true console.log(obj instanceof People); // true console.log(obj.sayName()); // 'anonymous' |
||
_es Profil |
pako:
„nevidim ziaden prakticky prinos.“ V konštruktore by sa mohlo vetviť, aký prototyp bude mať vrátený objekt. Napríklad by prototyp konštruktora mohol byť až druhým v poradí konštruktorov a pod. nápady. 1Pupik1989: „Zbytečné předávat prototype v konstruktoru.“ Išlo o reakciu na [#14] _es <- [#13] pako <- [#11] Chamurappi |
||
Časová prodleva: 3 dny
|
|||
1Pupik1989 Profil |
#21 · Zasláno: 28. 9. 2013, 07:31:56
Nicméně pořád nemá cenu vytvářet instanci objektu, která je hned zahozena. Čili to co je v P může být v jakékoliv funkci.
|
||
Časová prodleva: 11 let
|
0