Voir le flux RSS

danielhagnoul

Construire une "Class ES6" ayant des propriétés privées

Noter ce billet
par , 07/06/2015 à 12h53 (690 Affichages)
Pour rendre une propriété privée, le Dr. Axel Rauschmayer recommande de l'affecter à un WeakMaps. Dans le WeakMaps, les instances seront les clés. Le garbage-collector éliminera automatiquement les clés inexistantes.

Exemple :

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
let Person = ( function( ){
 
    const
        kFirstName = new WeakMap(),
        kLastname = new WeakMap();
 
    return class {
        constructor( first, last ){
            kFirstName.set( this, first );
            kLastname.set( this, last );
        }
        fullName( ){
            return kFirstName.get( this ) + " " + kLastname.get( this );
        }
    }
 
})( );
 
let Employee = ( function( P ){ 
 
    return class extends P {
        constructor( f, l, p ){
            super( f, l );
            this.p = p;
        }
        fp( ){
            return this.p;
        }
    }
 
})( Person );   
 
let Moi = new Employee( 'Daniel', 'Hagnoul', 'Belgique' );
 
console.log( Moi ); // $__0 {p: "Belgique"}
console.log( Moi.fp() ); // Belgique
console.log( Object.keys( Moi ) ); // ["p"]
console.log( Object.getOwnPropertyNames( Moi ) ); // ["p"]
console.log( Object.getOwnPropertySymbols( Moi ) ); // []
console.log( Moi.fullName() ); // Daniel Hagnoul

Nommer une propriété avec Symbol() c'est garantir son unicité. Avoir la certitude de ne jamais rentrer en conflit avec une autre clé.
Mais cette propriété n'est pas privée, car Object.getOwnPropertySymbols( MonObj ) permet de retrouver et d'utiliser son nom.

Exemple :

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
let Person = ( function( ){
 
    const
        kFirstNameProperty = Symbol( 'prénom' ),
        kLastNameProperty  = Symbol( 'nom' );
 
    return class {
        constructor( first, last ){
            this[ kFirstNameProperty ] = first;
            this[ kLastNameProperty ] = last;
        }
        fullName( ){
            return this[ kFirstNameProperty ] + " " + this[ kLastNameProperty ];
        }
    }
 
})( );
 
let Employee = ( function( P ){
 
    return class extends P {
        constructor( f, l, p ){
            super( f, l );
            this.p = p;
        }
        fp( ){
            return this.p;
        }
    }
 
})( Person );
 
let emp = new Employee( 'un', 'deux', 'trois' );
 
emp.p = 'une autre valeur';
 
console.log( emp.fp() ); // une autre valeur
 
console.log( Object.keys( emp ) ); // ["p"]
console.log( Object.getOwnPropertyNames( emp ) ); // ["p"]
console.log( Object.getOwnPropertySymbols( emp ) ); // [Symbol(prénom), Symbol(nom)]
console.log( emp.fullName() ); // un deux
 
emp[ Object.getOwnPropertySymbols( emp )[ 0 ] ] = 'Jacques';
 
console.log( emp.fullName() ); // Jacques deux

Envoyer le billet « Construire une "Class ES6" ayant des propriétés privées » dans le blog Viadeo Envoyer le billet « Construire une "Class ES6" ayant des propriétés privées » dans le blog Twitter Envoyer le billet « Construire une "Class ES6" ayant des propriétés privées » dans le blog Google Envoyer le billet « Construire une "Class ES6" ayant des propriétés privées » dans le blog Facebook Envoyer le billet « Construire une "Class ES6" ayant des propriétés privées » dans le blog Digg Envoyer le billet « Construire une "Class ES6" ayant des propriétés privées » dans le blog Delicious Envoyer le billet « Construire une "Class ES6" ayant des propriétés privées » dans le blog MySpace Envoyer le billet « Construire une "Class ES6" ayant des propriétés privées » dans le blog Yahoo

Mis à jour 09/06/2015 à 15h58 par Bovino

Catégories
Javascript , Développement Web

Commentaires