par , 07/06/2015 à 11h53 (1580 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 :
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 :
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 |