• # sans prétentions

    Posté par . En réponse au message Question sur les factories en Js. Évalué à 2.

    J'ai bien peur de ne pouvoir te renseigner sur les bonnes pratiques... je doutes de ne pas dire plus de bêtises qu'autre chose, et je ne crée plus que très rarement des classes en js.

    Ceci dit, je propose cette syntaxe,

    function Animal () {
     this.race = 'cheval'
     this.cri = 'hheeeinnnn'
     this.describe = function () {return 'whatever';}
     console.log(' ctor animal')
    }
    Animal.prototype.what = 'ever';
    function Animal2 () {
     Animal.call(this);
     console.log(' ctor animal2')
     this.tomate = function(){}
    }
    // Dans le browser
    Animal2.prototype = Object.create(Animal.prototype); // pareil que: Animal2 extends Animal
    // Avec node, 
    // require('util').inherits(Animal2, Animal); // pareil que: Animal2 extends Animal
    Animal2.prototype.some = 'other';
    function animalFactory (which) {
     var maBete;
     if (which==='chat') {
     maBete = new Animal2();
     maBete.race = 'chat'
     maBete.cri = 'miaou'
     var privateSecret = 'MIIIAAAAAOOOOUUUU'
     maBete.passCode = function () {
     return privateSecret;
     }
     } else {
     maBete = new Animal();
     }
     return maBete;
    }
    var chat = animalFactory('chat')
    var cheval = animalFactory('cheval')
    console.log('');
    console.log('chat est un animal: %s', chat instanceof Animal);
    console.log('cheval est un animal: %s', cheval instanceof Animal);
    console.log('');
    console.log('chat est un animal2: %s', chat instanceof Animal2);
    console.log('cheval est un animal2: %s', cheval instanceof Animal2);
    console.log('');
    console.log('chat %j', chat);
    console.log('cheval %j', cheval);
    console.log('');
    console.log('chat properties');
    for (var n in chat) {
     console.log('%s : %s', n, chat[n])
    } // note l'affichage des propriétés 'some' and 'what'
    console.log('');
    console.log('chat.keys() %j', Object.keys(chat))
    console.log('');
    console.log('cheval properties');
    for (var n in cheval) {
     console.log('%s %s', n, cheval[n])
    } // note l'affichage de la propriété 'what'
    console.log('');
    console.log('cheval.keys() %j', Object.keys(cheval))

    tldr; ma préférence à moi
    - pas d'Object.create,
    - si je dois faire un getter, je fais une variable définie dans un scope et une méthode pour y accéder
    - si je veux faire une propriété publique, je fais une propriété d'objet. Si je venais à avoir des problèmes et que j'avais soudainement le besoin de capturer le set/get, je me tournerais vers Object.defineProperty

    Voir,
    - https://nodejs.org/docs/latest/api/util.html#util_util_inherits_constructor_superconstructor
    - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

    Finalement, je n'aurais pas utiliser es6. C'est mon gout comme c'est ton choix, mais c'est la mode pas comme evelyne thomas.