Voir le flux RSS

danielhagnoul

Construction d'un modèle de type. Version ES6.

Noter ce billet
par , 16/06/2015 à 20h25 (457 Affichages)
Référence : Construction d'un modèle de type dans le but d'améliorer la gestion des propriétés d'un objet

Construit sur l'acquis des billets précédents, ce billet ne contient que l'essentiel : le code.

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
const
    kModel = Symbol( 'ObjModel' ),
    kGetType = function( Obj ){
        return Object.prototype.toString.call( Obj ).match( /\s([a-zA-Z]+)/ )[ 1 ].toLowerCase();
    },
    kSetModel = function( Obj ){
 
        if ( kGetType ( Obj ) === "object" ){
 
            Obj[ kModel ] = Object.create( Object.prototype );
 
            Object.getOwnPropertyNames( Obj ).forEach( function( key ){
 
                if ( key != kModel ) {
 
                    Object.defineProperty( Obj[ kModel ], key, {
                        "value" : kGetType ( Obj[ key ] ),
                        "enumerable" : true
                    });
                }
            });
 
            Object.getOwnPropertySymbols( Obj ).forEach( function( key ){
 
                if ( key != kModel ) {
 
                    Object.defineProperty( Obj[ kModel ], key, {
                        "value" : kGetType ( Obj[ key ] ),
                        "enumerable" : true
                    });
                }
            });
 
        } else {
            throw "Erreur dans setModel(), " + Obj + " n'est pas un objet";
        }
    };
 
let Animal = ( function( ){
 
    const
        kNom = new WeakMap();
 
    return class {
        constructor( name, race ){
            kNom.set( this, name );
        }
        get nom( ){
            return kNom.get( this );
        }
    }
 
})( );
 
let Dog = ( function( A ){
 
    const
        kRace = Symbol( 'Race' );
 
    return class extends A {
        constructor( nom, race ){
            super( nom );
            this[ kRace ] = race;
        }
        get race( ){
            return this[ kRace ];
        }
        set race( value ){
            if ( this[ kModel ][ kRace ] === kGetType ( value ) ) {
                this[ kRace ] = value;
            }
        }
        sayName( str ){
            var texte = str || "";
            return ( texte + super.nom );
        }
        bark( ){
            return "Woof!";
        }
    }
 
})( Animal );
 
let
    Youki = new Dog( "Youki", "Makita" ),
    Caline = new Dog( "Caline", "Bichon" );
 
Object.defineProperties( Caline, {
    "vacciner" : {
        "value" : true,
        "enumerable" : true
    }
});
 
kSetModel( Youki );
kSetModel( Caline );
 
console.log( Youki );
console.log( Caline );
 
console.log( Youki.nom, Youki.race ); // Youki Makita
 
Caline.race = 42; // ignoré car le getType() est différent
 
console.log( Caline.nom, Caline.race, Caline.vacciner ); // Caline Bichon true

Envoyer le billet « Construction d'un modèle de type. Version ES6. » dans le blog Viadeo Envoyer le billet « Construction d'un modèle de type. Version ES6. » dans le blog Twitter Envoyer le billet « Construction d'un modèle de type. Version ES6. » dans le blog Google Envoyer le billet « Construction d'un modèle de type. Version ES6. » dans le blog Facebook Envoyer le billet « Construction d'un modèle de type. Version ES6. » dans le blog Digg Envoyer le billet « Construction d'un modèle de type. Version ES6. » dans le blog Delicious Envoyer le billet « Construction d'un modèle de type. Version ES6. » dans le blog MySpace Envoyer le billet « Construction d'un modèle de type. Version ES6. » dans le blog Yahoo

Mis à jour 16/06/2015 à 22h10 par danielhagnoul

Catégories
Javascript , Développement Web

Commentaires