Inštancie a triedy samotné využívaju prototyping a preto je ľahké ich dediť alebo konfigurovať na jednotlivých úrovniach.

Tvorba tried

Založenie novej triedy vyžaduje unikátny názov a super Triedu:

ClassFactory.defineClass('MojaTrieda', 'Canvas')

Odteraz môžme vytvárať inštancie cez MojaTrieda.create();

Vlastnosti triedy

Tieto sa definujú pomocou .addClassProperties({}) a sú dostupné cez MojaTrieda.vlastnost. Môžu to byť primitívne hodnoty, objekty, a teda aj funkcie.

Vlastnosti inštancie

Inštančné vlastnosti sa definujú pomocou .addProperties({}). Získanie triedy z inštancie sa deje pomocou .getClass().

Príklad tried

ClassFactory.defineClass('AbstractContainer', 'Layout')
.addClassProperties({
  containerCount: 0,
  author: 'andy'
})
.addProperties({
  orientation: 'vertical',
  title: 'untitled',
  initWidget: function() {
    this.Super('initWidget', arguments);
    this.addMember(Label.create({ contents: this.title}));
  }
});
ClassFactory.defineClass('ConcreteContainer', 'AbstractContainer')
.addProperties({
  canvasClass: 'ListGrid',
  initWidget: function() {
    this.Super('initWidget', arguments);
    this.addMember(ClassFactory.getClass(this.canvasClass).create(this.canvasProperties));
  }
});

No a na použitie takejto štruktúry nám už stačí zavolať:

var cont = ConcreteContainer.create({
  title: 'Môj nadpis', canvasClass: 'TreeGrid', canvasProperties: {dataSource: 'mojDataSource'}
});

Prototyping

Objekty v JS môžu mať prototyp, čiže default vlastnosti. Tie ale nie su priamo súčasťou ich inštancie, a teda pri získavaní len vlastných vlastností je nutné overovanie:

for (var prop in obj) {
  if (obj.hasOwnProperty(prop)) {
    var value = obj[prop]; // len vlastná vlastnosť
  }
}

SC nekončí len pri tom, ale pridáva ďaľší rozmer prototypu objektu podľa želania ovládajúceho parenta. 

Príkladom je výpočet vlastností FormItem vo Form:

FieldSet Item instance > FieldSet Item > Optimized Field > Field editorProperties > FormItem defaults > Form instance Item defaults > inherited FormItem defaults > Field > Type editorProperties > Type 

Observer

Observer pattern prepája 2 widgety, jeden sleduje spustenie metódy druhého:

var action = Button.create();
var list = ListGrid.create();
action.observe(list, 'selectionChanged', "observer.someFunction(observed);");