Autor Zpráva
joe
Profil
Ahoj,

zase bádám nad tim, jak správně a kdy použít nebo nepoužít prototype. Chci si psát takové menší svoje třídy, které pak využiju jinde, včetně použití jmenných prostorů.

Aby bylo jasné, co potřebuju, uvedu příklad:

- třídu pro Uživatele diskuse jakpsatweb.cz, která bude mít metody getName, setName, setBirthdate, getBirthdate, getAge ... a já nevím co ještě :)

Tak tedy, teď bych to potřeboval dát do jmenných prostorů:
var cz = cz || {};
cz.jakpsatweb = cz.jakpsatweb || {};

  /**
 * @constructor
 */
cz.jakpsatweb.Uzivatel = function() {
  this.xxx = function() {
    // ...
  }
}

Teď by mě zajímalo, kdy se hodí používat k definování metod prototype a nebo definování funkcí/proměnných přímo v konstruktoru (tučně označeno)?
cz.jakpsatweb.Uzivatel.prototype.getName = function() {
  return this.name;
}

Funkčně to rozdíl mít nebude, ne? Přes prototype proto, aby se nevytvářely nové a nové funkce při každé vytvořené instanci (jak už jsem se tu dříve dočetl), tak co se teda hodí všechno dělat v tom konstruktoru?

Hodil by se mi přístup:
var uzivatel = new cz.jakpsatweb.Uzivatel();
uzivatel.set..();


Pak by se všechno dalo udělat přes prototype nebo se pletu? A kam s "konstantama"?

Díky za odpověď

---
PS: Všem šťastný nový rok a chválím "novou" diskusi :)
Radek9
Profil
joe:
Obecně je nejlepší dávat všechny public metody do prototypu. Do konstruktoru dávej metody pouze, pokud potřebuješ přístup k vnitřním (vlastně privátním) proměnným. Můžeš se o tom dočíst tady: http://javascript.crockford.com/private.html
joe
Profil
Radek9:
Super, díky. Už mi to je jasné.

Z toho plyne, že pokud bych chtěl v JS vytvořit typ Enum, měl bych to udělat přes prototype? Tzn. takto:

cz.jakpsatweb.Uzivatel.prototype.pohlavi = { muz: 'm', zena: 'f'}

? I když zase hrozí riziko přepsání.
Radek9
Profil
joe:
Teď jde o to, jak to chceš použít. Do prototypu se dávají vlastnosti, které se přilepí na každou novou instanci (a pozor, přilepí se tam vždy ten samý objekt, takže pokud to upravíš v jedné instanci, bude to mít dopad i na ostatní). Pokud chceš nějaký globální seznam, tak si to přilep přimo na uživatele (tedy cz.jakpsatweb.Uzivatel.pohlavi).
_es
Profil
Radek9:
pokud to upravíš v jedné instanci, bude to mít dopad i na ostatní
Nie, vtedy sa vytvorí nová vlastnosť len toho jedného objektu a prototyp zostane rovnaký.
Radek9
Profil
_es:
Já nemyslel, že se bude měnit přímo prototyp, ale ten objekt pohlavi. Schválně jsem to ještě zkusil a je to opravdu tak (jelikož se dědí reference na ten objekt, ne klon toho objektu):
function A(){
}
A.prototype.b = {test: "ahoj"};
var a = new A(), b = new A();
a.b.test2 = "čau";
alert(b.b.test2);//vypíše čau
_es
Profil
Radek9:
Ten tvoj kód je trochu nezvyklý, ja som myslel toto:
function A(){} 
A.prototype.v = "x"; 
var a = new A(), b = new A(); 
a.v = "y"; 
alert(a.v);//vypíše y
alert(b.v);//vypíše x
delete a.v;
alert(a.v);//vypíše x
Radek9
Profil
_es:
Samozřejmě, já to psal podle joova (předem se omlouvám, jestli jsem to skloňování zkonil) zápisu v [#3].

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: