dojo/_base/declare
A JavaScriptben prototípusos öröklődés van, nem pedig osztályalapú. A Dojo ezzel a modullal lehetőséget ad az osztályalapú öröklődés szimulálására.
Osztály definiálása
A declare szignatúrája:
- className: a konstruktor neve (a prototípusban a declaredClass property-ben van tárolva)
- superclass: lehet null, Function, vagy Function-ök tömbje, ezek definiálják az ősöket
- props: az az objektum, aminek a property-eit belemásoljuk a létrehozandó prototípusba
// in demo/Animal.js:
define([ "dojo/_base/declare" ], function(declare) {
return declare(null, {
constructor : function(legs) {
this.legs = legs;
},
});
});
Az osztály használata:
require([ "demo/Animal" ], function(Animal) {
var dog = new Animal(4);
console.log(dog.legs);
})
Ha az osztály tartalmaz tömböket vagy más objektumokat, azokat a konstruktorban kell deklarálni, hogy minden példánynak meglegyen a saját másolata. Egyszerű típusoknál nincs ezzel probléma, mert azok érték szerint adódnak át, az objektumok azonban referencia szerint.
Öröklődés
A superclass argumentummal származtathatunk más osztályokból.
Az ősosztályok konstruktorai mindig automatikusan meghívódnak a leszármazott konstruktora előtt. Minden más esetben így hivatkozatunk az ősosztályban lévő ugyanolyan nevű metódusra: this.inherited(arguments)
Példa: demo/Bird.js
A dojo támogatást ad a többszörös öröklődésre, C3 superclass linearization algoritmust implementál. Az első átadott osztály az igazi ősosztály, a többi csak mixin, amiknek a tulajdonságai bele vannak keverve a leszármazottba. A gyakorlatban ez azt jelenti, hogy ilyen osztályokra nem alkalmazhatjuk az instanceOf operátort, hanem helyette az isInstanceOf() függvényt használhatjuk.
Példa: demo/Cocktail.js
Konvenciók
- a className-et, a declare első argumentumát nem használjuk, hanem az AMD modulazonosító lesz az osztály neve (tehát ha az oszályunk a package/Class.js fájlban van, akkor package/Class lesz a neve
- az osztályokat UpperCamelCased formában nevezzük el
- a privát osztyálok _-al kezdődnek, pl. _MyPrivateClass
- a publikus osztályok és a modulok közt 1-1 megfeleltetés van, így ezeknek vissza kell térni a modulváltozóval
- a privát osztályokat deklaráljuk változóként a modulokon belül
define([ "dojo/_base/declare" ], function(declare) {
var _MyPrivateItem = declare(null, {
someProperty : null
});
return declare(null, {
item : null,
constructor : function() {
this.item = new _MyPRivateItem();
}
});
});