Une petite parenthèse sur deux fonctions que vous verrez beaucoup si vous allez voir le code de WinJS pour Windows 8.
WinJS.Namespace.define
WinJS.Namespace.define est un raccourci pour définir un namespace en JavaScript. Pour rappel, un namespace évite de polluer l’espace de nom global en définissant des namespaces pour l’application, des « packages » appartenant à l’application en quelques sortes. Ainsi, vous éviterez de définir des objets / fonctions de manière globale.
La syntaxe est la suivante : var ns = WinJS.Namespace.define(<name>, <members>) où <name> est une String (les « . » sont acceptés) et <members> est un objet.
Si vous appelez WinJS.Namespace.define plusieurs fois avec le même <name>, les <members> sont combinés. En cas de collision, le dernier ajouté gagne:
WinJS.Namespace.define("MyNamespace", { x: 10, y: 10 }); WinJS.Namespace.define("MyNamespace", { x: 20, z: 10 }); //MyNamespace == { x: 20, y: 10, z: 10}
WinJS.Class.define
La fonction WinJS.Class.define permet de définir des « classes » au sens JavaScript du terme (un objet avec un constructeur).
Ssa syntaxe: var className = WinJS.Class.define(<constructor>, <instanceMembers>, <staticMembers>) où <constructor> est une fonction, <instanceMembers> est un objet contenant les méthodes et propriétés de la « classe » (prototype) et <staticMembers> est un objet avec des propriétés et des méthodes qui peuvent être accédées directement sur l’objet sans passer par l’instance via <className>.<member>.
Variantes de WinJS.Class
Vous avez aussi dans WinJS.Class, la méthode WinJS.Class.derive(<baseClass>, …) qui crée une sous-classe en utilisant l’héritage prototypal et WinJS.Class.mix(<constructor>, [<classes>]) qui définit une classe en combinant les membres (statiques et non-statiques) de plusieurs autres « classes » et leur associe un <constructor>.
Pour finir, une petite précision sur une pratique que vous allez voir souvent dans le code de WinJS. Comme les définitions de classe ne génèrent qu’un objet, WinJS.Class.define est typiquement utilisé dans un mobile dont l’objet résultat est exporté au reste de l’application par un namespace. Vous pouvez ensuite utiliser « new <namespace>.<class> n’importe où dans votre application.