168 votes

Fonction constructeur et fonctions usine

Quelqu'un peut-il clarifier la différence entre une fonction constructeur et une fonction usine en Javascript.

Quand utiliser l'un plutôt que l'autre ?

0voto

PeterH Points 138

Les usines sont une couche d'abstraction, et comme toutes les abstractions, elles ont un coût en complexité. Lorsque l'on rencontre une API basée sur une fabrique, il peut être difficile pour le consommateur d'API de savoir quelle est la fabrique pour une API donnée. Avec les constructeurs, la découverte est triviale.

Lorsque vous devez choisir entre les ctors et les usines, vous devez décider si la complexité est justifiée par les avantages.

Il convient de noter que les constructeurs Javascript peuvent être des usines arbitraires en retournant autre chose que this ou undefined. Ainsi, en js, vous pouvez obtenir le meilleur des deux mondes - API découvrable et mise en commun/cache des objets.

5 votes

En JavaScript, le coût de l'utilisation des constructeurs est plus élevé que celui de l'utilisation des fabriques car toute fonction en JS peut retourner un nouvel objet. Les constructeurs ajoutent de la complexité en : Requérant new Modification du comportement de this Modification de la valeur de retour, Connexion d'un prototype ref, Activation instanceof (qui ment et ne doit pas être utilisé à cette fin). Ostensiblement, tous ces éléments sont des "fonctionnalités". En pratique, elles nuisent à la qualité de votre code.

0voto

Mostafa Points 1099

Pour les différences, Eric Elliott a très bien clarifié,

Mais pour la deuxième question :

Quand utiliser l'un plutôt que l'autre ?

Si vous venez d'un milieu orienté objet, la fonction Constructor vous paraîtra plus naturelle. De cette façon, vous ne devez pas oublier d'utiliser new mot-clé.

0voto

Mohamed S.Shelf Points 21

Une nouvelle chose à ajouter aux réponses précédentes est qu'il existe une nouvelle façon de déclarer les fonctions Constructor.

class CreateCirle {
    constructor(radius) {
        this.radius = radius;
        this.draw = function () {
            console.log('we draw a circle with radius: ', this.radius);
        };
        this.name = "Circly";
        this.address = "Math Graph";
    }
}

vous devez ajouter class y constructor mot-clé.

puis l'invoquer normalement sans aucune différence.

let cirle = new CreateCirle(5);
cirle.draw();

N'oubliez pas de le faire avec la convention de nom PascalCase comme mentionné précédemment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X