Polemika o objektových principech v JavaScriptu
od aichi
Čirou náhodou jsem narazil na článek Ruby on Rails? Děkuji, nechci. od Davida Grudla a ač na první pohled jeho povzdech chápu, s tvrzeními okolo JS a potažmo prototypovými jazyky, souhlasit nemohu.
...
Ve svém článku linkuje a odvolává se na povzdech Richarda Šerého nad vlastnostmi JavaScriptu. Nicméně oba se mýlí. Oba naráží na porušení základního paradigma OOP a to zapouzdření. Toto porušení prý nastává při používání prototypové dědičnosti, kdy změna prototypu vyvolá automaticky změny ve všech instancích objektů, které jsou od prototypového objektu odvozeny.
Paradigma OOP
Co jsou vlastně základní principy OOP? Je to Identita, Zapouzdření a Skládání. A co je to Zapouzdření?
Zapouzdření je princip schovávání vnitřních dat a mechanizmů objektu před venkovním prostředím, viz wiki, nebo Ars programatika blog.
Ještě je nutné si rozebrat prototypovou dědičnost. Prototypové jazyky nemají třídy jako předpisy pro vytváření instancí, ale mají prototypové objekty, ze kterých jsou vytvářeny kopie. Při vytvoření kopie jsou prototypové vlastnosti kopírovány do nově vzniklého objektu. V Javascriptu a některých jiných jazycích se nevytváří kopie, ale reference. Tudíž změna prototypového objektu se promítne do všech vyklonovaných instancí. Tomu můžeme zabránit tím, že vlastnosti definujeme lokálně, pak je reference přepsána lokální hodnotou a úpravy prototypu nemění klon.
Tak a teď ke stížnosti ohledně porušení zapouzdření. Prototypová dědičnost neporušuje tento princip ač se zdá, že je to naopak, když změnou prototypu lze měnit klony. Nicméně si musíme uvědomit, že neměníme jejich lokální vlastnosti, ale defakto jejich vlastnosti "globální", sdílené mezi instancemi. Dalo by se to přirovnat vytvoření PHP static vlastnosti ve třídě a static setovací metody, kdy bychom se pak mohli podivovat že zápis do této vlastnosti pomocí statické metody ovlivňuje obsah této vlastnosti ve všech instancích.
Závěrem si zopakujme, že prototypové vlastnosti se v Javascriptu "dědí" referencí, tudíž to nejsou vlastní vlastnosti a metody instance, dokud si je instance sama nepřepíše (stanou se vlastní). Tím pádem nejde o porušení zapouzdření.
Adresy zpětných odkazů pro tento příspěvek:
Trackback URL (right click and copy shortcut/link location)
19. 02. 09 16.34:07, 
