Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Odpověď na názor

Odpovídáte na názor k článku Třídy, dědičnost a OOP v Javascriptu - I.

Daniel Steigerwald aura:52
16. 3. 2010 4:18

Re: Špatný článek

celé vlákno

Pane Bronislave Klučko (jste to vy: http://www.bauglir.com, že?), spravedlivý hněv vás zaslepil, ale to nevadí, to se občas stane každému.
Váš komentář vítám, protože mi dává příležitost opět vyvrátit pár omylů. Pojďme si je tedy rozebrat. Opakování je matka moudrosti ,–)

1) Je častou chybou programátorů začátečníků, brát všechny pojmy dogmaticky. Možná vás to překvapí, ale co platí v jednom programovacím jazyce, nemusí platit v jazyce jiném. Jedním z takových pojmů je třída. Každý jazyk ji definuje po svém, a Javascript není výjimkou. V úvodu, který jste určitě bleskem pouze přelétl, už už aby jste mohl komentovat, jsem zdůrazňoval, že jde o konsensus mezi autory Javascriptových knihoven. Koukněte: dojo, mootools, yui, google closure, prototype, qooxdoo. Všichni hovoří o třídách. Za třídu se v Javascriptu označuje konstrukční funkce, používající vlastnost prototype. Už vidíte, jak moc se mýlíte?

Mimochodem, když už chcete citovat ze specifikace, poprosil bych o celou větu až dokonce. Ta zní: „ECMAScript does not use classes such as those in C++, Smalltalk, or Java.“ Hned to zní jinak, že? :-) Dokonce i specifikace mluví o třídách, pouze zdůrazňuje, že jsou jiné.

2) Javascript samozřejmě primitivní typy má. Když už tu mlátíte specifikací o stůl, tak si snad zvládnete i dohledat větu: „A primitive value is a member of one of the following built-in types: Undefined, Null, Boolean, Number, and String;“. Vy ale zcela evidentně nevíte, co primitivní znamená. Vážně jste si nikdy nevšiml, že se v Javascriptu některé typy předávají referencí, a jiné hodnotou?

Byl bych k vám krutý, kdybych nevysvětlil, jak váš příklad ve skutečnosti funguje.

var num = 5; 

Tento zápis skutečně deklaruje primitivní hodnotu. Zkuste předat num do nějaké funkce, tam jej inkrementovat. Změní se původní num? Nezmění, protože je primitivní a byl tedy předán hodnotou. Dále si můžete vyzkoušet přiřadit nějakou hodnotu:

var num = 5;
num.a = 1;
alert(num.a)​ // undefined 

Sakra, nejde to. Proč? Protože num je primitivní :-D

Jiná situace by byla, pokud byste napsal:

var num = new Number(5) 

S takto vytvořeným číslem můžete pracovat stejně jako s jeho literárním zápisem, avšak pozor, num se předává referencí. Schválně si to zkuste, protože je to pro vás evidentně nová věc. Pomalu se blížíme v rozuzlení vašeho (krapet ukecaného) příkladu. Proč ukecaného? Protože stejného výsledku dosáhneme i takto:

var num = 5;
alert(num.toString())​ 

Jak je vidět, ani nemusíte vytvářet objekt ‚a‘ :-)

Shrnutí. Literární zápis generuje primitivní hodnoty, zatímco zápis pomocí konstruktoru (Number, Boolean, String) objektové reprezentace. Převést primitivní hodnotu na její objektovou reprezentaci, lze pomocí přímého volání konstruktoru, ani nemusíme použít new.

var num = 5;
var objectNum = Number(num); 

Obráceně to za nás Javascript udělá vždy, když detekuje, že by se primitivní hodnota hodila, nebo to lze provést explicitně, a jak ukazuje poslední alert, dokonce můžeme používat vlastní objekt, číslo imitující.

var objectNum = new Number(5);
alert(objectNum + 2); // 7
alert(objectNum.valueOf() + 2); // 7
var customNumber = {
    valueOf: function() {
        return 5;
    }
};
alert(customNumber + 2); // 7
​ 

Za domácí úkol si spočítejte, kolikrát je pojem ‚primitive‘ zde uveden.

3) K poslednímu bodu bych dodal, že právě Vy, byste si měl článek poctivě pročíst, a to ve svém vlastním zájmu.

   
Chcete přispět jako registrovaný uživatel? Přihlaste se ke svému účtu.
Ochrana proti spamovacím robotům. Odpovězte prosím na následující otázku: Jaký je letos rok?
 

Pravidla pro diskutující: Přidáním čtenářského příspěvku do diskusí či fóra souhlasíte s pravidly.

Informace o soukromí: U všech přidaných komentářů provozovatel ukládá IP adresu a hostname odesílatele. U neregistrovaných uživatelů se na webu zobrazuje část hostname, případně IP adresy, neumožňující identifikovat konkrétní počítač.

Povolené značky XHTML: a, br, code, em, li, ol, p, pre, strong, sub, sup, ul