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 |