Voici un systeme de gestion de la POO en Javascript

auteur : FremyCompany

Télécharger le code complet

Utilisation :
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Ajout d'un sous espace de nom à System
            with(System.addNameSpace("My")) {
                // Ajoute d'une classe
                with(addClass("MyClass", /* Constructeur, argument facultatif */ function() {
                    /* Cet appel est requis par le Designer de classe */
                    this.getType().New(this);
 
                    /* Vous pouvez ajouter ici tout autre appel prévu par votre fonction */
                    // Utilisation d'un Evenement (créé ici par la propriété)
                    this.onFieldChange.addHandler(function(sender, e) {
                        sender.Field=sender.getField();
                    });
                })) {
                    addProperty("Field"); // Ajoute une propriété public à la classe (n'a aucun rapport avec le champ Field, le rapport officieux est effectué ligne 11)
                    addSub("resetField", function() { this.setField(null); }) // Ajoute une fonction à la classe
                    /*
                        addEvent("X") // Ajoute l'evenement onX à la classe
                        addClass("subClass") // Ajoute une sous classe
                    */
                }
            }
 
            // Instanciation de la classe
            var MCI=new System.My.MyClass();
 
            // Invocation d'une propriété (get/setP)
            MCI.setField("value");
 
            // Création d'un délégué
            var getMCIField=CreateDelegate(MCI.getField, MCI);
 
            // Utilisation du délégué, le lien avec l'objet est fait par JavaScript
            alert("getMCIField:"+getMCIField());
 
            // Invocation d'une fonction (F)
            MCI.resetField();
            alert("MCI.getType().getPath():"+MCI.getType().getPath());
 
            // Destruction partielle de l'objet (pour prendre de vitesse le Garbage Collector)
            // MCI.dispose();
 
            // Test de getType()
            try { alert("document.getType():" + document.getType().getPath()); } catch (ex) {} //(IE:Erreur; FF:System.Object)
            alert("getTypeOf(document):" + Object.getTypeOf(document).getPath()) //(IE:System.XMLNode; FF:Idem)
            alert("getTypeOf(document.firstNode):" + Object.getTypeOf(document.firstNode).getPath()) //(IE:System.Undefined; FF:Idem) ((PS::document.firstNode doesn't exist))
            alert("getTypeOf(null):" + Object.getTypeOf(null).getPath()) //(IE:System.Undefined; FF:Idem)
            alert("getTypeOf(Function):"+getTypeOf(function() {}).getPath());
 
            // Test de isSubClassOf
            with(System.addClass("TestEventArgs")) {
                inherits(System.EventArgs);
            }
            with(System.addClass("TestEventArgs2")) {
                inherits(System.TestEventArgs);
            }
            var T=new System.TestEventArgs2();
            alert("SubClassOf(T,EventArgs&Object):"+isSubClassOf(T, System.EventArgs) + "&" + isSubClassOf(T, System.Object))
            alert("InstanceOf(T,TestEventArgs2):"+isInstanceOf(T, System.TestEventArgs2))
            alert("InstanceOf(T,TestEventArgs):"+isInstanceOf(T, System.TestEventArgs))
            alert("SubClassOf(T,Event):"+isInstanceOf(T, System.Event))
            alert("SubClassOf(3,Number):"+isSubClassOf(3, System.Number))
            alert("SubClassOf(false,Boolean):"+isSubClassOf(false, System.Boolean))
            alert("SubClassOf(Type,Function):"+isSubClassOf(T.getType(), System.Function))
            // Test forEach
            var t1={"value":true,"value2":false}
            alert("forEach: all")
            t1.forEach(function(o,k) { alert (k) })
            alert("forEach: ownPropertiesOnly")
            t1.forEach(function(o,k) { alert (k) }, true)
            t1=["value","value2"];
            alert("Array; forEach: all")
            t1.forEach(function(o,k) { alert (k) })

Remarques :
Ce code n'en est qu'à ses débuts. Il gère IE+FF+Opéra.
Il gère actuellement :
- Espaces de noms
--- Importation
--- Sub NameSpace
- Classes
--- Création simple
--- Propriétés (r/w) avec champs privés
--- Gestion poussées des evenements
--- Héritages
--- Réflection (Début)
- Add-ins et interfaces (déjà implémenté, mais pas d'exemple)
- Meilleurs performances du code
- Fonctions de base implémentées (returnNull, returnFalse, emptyConstructor)
- Création de délégués (lier une fonction à un objet)
- ...
Dans le futur, je projète de pouvoir ajouter du commentaire à une fonction (ou propriété). Je vais aussi faire un exemple pour ce qui est de l'utilisation d'Add-In ou d'interface