Dědičnost v Javascriptu a self
3.2.2015

Při používání dědičnosti v Javascriptu jsem narazil na problém, že v JS neexistuje nic jako new self v PHP.

Předpokládejme, že pro implementaci dědičnosti používáme následující funkci. Je velmi podobná tomu, co generuje EcmaScript 6 transpiler od Facebooku.

/**
 * @param {function} child constructor
 * @param {function} parent constructor
 *
 * @see http://www.zdrojak.cz/clanky/tridy-dedicnost-a-oop-v-javascriptu-ii/
 */
function inherits(child, parent) {
    // temporary constructor
    var F = function () {};
    F.prototype = parent.prototype;
    child.prototype = new F();

    // access to parent prototype methods
    child._superClass = parent.prototype;

    // set constructor back
    child.prototype.constructor = child;

    // copy static methods
    for (var methodName in parent) {
        if (parent.hasOwnProperty(methodName)) {
            child[methodName] = parent[methodName];
        }
    }
};

Všimněte si, že pokud chcete podědit i „statické“ metody, musíte si je ručně překopírovat.

Rodič

Budu chtít vyrobit třídu Zvire, která bude obsahovat hrozně sofistikovanou továrničku na vytváření svých instancí.

// define Zvire

function Zvire() {
    this.sound = "uaaaaa";
}

Zvire.create = function () {
    return new this();
}

Abych mohl použít továrničku i pro poděděné třídy, je nová instance vytvářena pomocí new this. Princip je jednoduchý – create je metodou objektu Zvire (nebo níže objektu Pes) a this je tak shodou okolností také konstruktorem tříd Zvire a Pes.

Zvire.prototype.clone = function () {
    return new (this.constructor)();
}

V instančních metodách tento trik použít nemůžeme. Naštěstí si JS pamatuje konstruktor objektu ve vlastnosti constructor.

Potomek

Nyní můžeme definovat třídu Pes.

// define Pes

function Pes() {
    this.sound = "haf";
}

inherits(Pes, Zvire);

A všechno funguje tak, jak potřebujeme.

alert(Pes.create().sound); // haf

var pes = new Pes();
alert(pes.clone() instanceof Zvire); // true
alert(pes.clone() instanceof Pes); // true

SlideBox: prezentace jednoduše
3.7.2014

SlideBox je webová aplikace sloužící k tvorbě a prohlížení prezentací. Vytvořil jsem ji letos na rozhraní jara a léta jako diplomovou práci na ČVUT FIT.

Texy

Nejdůležitější vlastností, která odlišuje SlideBox od konkurence, je použití Texy pro zápis slajdů v editoru prezentace. Při vytváření slajdů se tak nesoustředíte na vzhled, správné zarovnání obrázků a podobně, ale jen na tvorbu obsahu.

Jednotlivé slajdy jsou odděleny buď nadpisem nebo horizontální čárou. Použít je samozřejmě možné jakékoliv formátovací značky Texy, například ty pro bodový seznam či tučný text.

Slajd
*****

- bod
- druhý bod

Druhý slajd
***********

[* obrazek.jpg *]

-------

Obsah třetího slajdu.

Použití Texy velmi zjednodušuje běžné editační úkony jako rozdělení slajdu na dva (jen přidám nadpis či čáru) nebo přesunutí textu z jednoho slajdu na druhý.

Možná se zdá, že Texy bude vhodné jen pro technicky pokročilé uživatele, ale můžu s potěšením konstatovat, že uživatelské testování tuto obavu vyvrátilo.

Prohlížení

Prezentaci prohlížíte ve webovém prohlížeči, je však možné ji stáhnout i ve formátu PDF.

Představení SlideBoxu na Poslední Sobotě

Snadné sdílení

Po předvedení prezentace je obvykle potřeba vymyslet, kam ji nahrát. U SlideBoxu stačí zmáčknout tlačítko publish a už je dostupná na webu.

Další funkce

Kde to uvidím?

Na aplikaci se podívejte na slideboxapp.com, zdrojové kódy jsou na Githubu a novinky se můžete dočíst na Twitteru.


Globální instalace PHPUnitu pomocí Composeru
25.6.2014

Vždy, když jsem zatím chtěl nainstalovat globálně PHPUnit, musel jsem si vygůglit pár příkazů pro instalaci pomocí Pearu, spustit je, vyřešit několik chybových hlášek, abych po deseti minutách měl hotovo.

Tomu je nyní konec, protože globální instalaci knihoven zvládá již i Composer.

composer global require "phpunit/phpunit=4.1.*"

Tento příkaz vytvoří podsložku .composer v domovském adresáři a nainstaluje tam PHPUnit v zadané verzi.

Aby bylo možné příkaz phpunit kdekoliv použít, je ještě potřeba přidat složku ~/.composer/vendor/bin do path.