| Autor | Zpráva | ||
|---|---|---|---|
| joe Profil |
#1 · Zasláno: 1. 1. 2012, 14:09:37 · Upravil/a: joe
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 |
||
|
Časová prodleva: 4 dny
|
|||
| joe Profil |
#3 · Zasláno: 5. 1. 2012, 13:13:23
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 |
#4 · Zasláno: 5. 1. 2012, 22:39:56
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 |
#5 · Zasláno: 6. 1. 2012, 05:37:58
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 |
#6 · Zasláno: 6. 1. 2012, 08:03:02
_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 |
#7 · Zasláno: 6. 1. 2012, 08:26:19
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]. |
||
|
Časová prodleva: 15 let
|
|||
0