50 votes

Dois-je utiliser un prototype ou pas?

Je suis en création d'un Vecteur de classe, qui peuvent fondamentalement tenir trois valeurs numériques. Cependant, beaucoup d'opérations peuvent être effectuées sur un tel vecteur - par exemple, l'obtention de l'ampleur, en ajoutant ou en soustrayant un autre vecteur etc.

Je me demandais si ces fonctions doivent être codées comme étant un prototype de fonction de la classe Vector, ou que je doit les définir dans le constructeur.

Alors laquelle de ces deux méthodes est-elle préférable?

function Vector3D(x, y, z) {
    this.x = x;
    this.y = y
    this.z = z;
}

Vector3D.prototype.magnitude = function() {
    return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
};

ou

function Vector3D(x, y, z) {
    this.x = x;
    this.y = y;
    this.z = z;

    this.magnitude = function() {
        return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
    };
}

50voto

Box9 Points 41987

C'est exactement la situation de l'aide d'un prototype. Je vois deux avantages principaux pour le faire:

  1. Les fonctions ne sont pas créés plusieurs fois. Si vous définir les fonctions à l'intérieur du constructeur, une nouvelle fonction anonyme est créé pour chaque fonction que vous définissez, à chaque fois que le constructeur est appelé. Les Prototypes sont des objets statiques, et chaque instance de Vector3D sera tout simplement référence au prototype des fonctions.
  2. Le prototype est un objet unique qui peut être facilement manipulé. Cela offre une grande flexibilité; malheureusement, je ne suis en mesure de fournir quelques exemples de ce que cela peut offrir:
    1. Si vous souhaitez créer une classe enfant, par exemple Vector3DSpecial, vous pouvez simplement cloner Vector3D.prototype et assigner à Vector3DSpecial.prototype. Alors que vous pouvez également le faire à l'aide de constructeurs en Vector3DSpecial.prototype = new Vector3D();, les constructeurs peuvent contenir des effets secondaires qui seront exécutés dans cette simple prototype d'affectation, et devrait donc être évitée. À l'aide de prototypes, vous pouvez même choisir uniquement des fonctions particulières dans le prototype de la copier sur la nouvelle classe.
    2. Ajout de méthodes d' Vector3D est tout simplement une question de l'ajout de propriétés pour le prototype, et permet à votre code sera plus facile à split / organisé en plusieurs fichiers, ou pour permettre l'ajout de méthodes dans d'autres parties du code dynamiquement. Bien sûr, vous pouvez faire une combinaison d'ajouter des méthodes dans le constructeur et par le prototype, mais qui n'est pas uniforme et est susceptible de conduire à plus de complexité supplémentaire en bas de la piste.

Quand aurais-je pas utiliser le prototype? Pour les objets singleton, par exemple un contrôleur qui interagit avec une page et il peut déléguer ce travail à d'autres objets. Une "notification" de l'objet en est un exemple. Ici, l'extension est peu probable, et l'objet n'est créé qu'une seule fois, en faisant le prototype d'une (conceptuel) et de la complexité.

9voto

jishi Points 10442

Prototypes de méthodes de travail uniquement pour les propriétés publiques, si vous souhaitez garder une trace de x, y, z comme "privé", les variables le prototype ne fonctionnerait pas.

Je voudrais utiliser ce dernier, parce que vous pourriez souhaitez que des méthodes qui ne fonctionnent qu'avec le privé/les variables internes, mais tout dépend du contexte.

function Vector3D(x, y, z) {
   // x, y, z is automatically in this scope now, but as private members.
   this.magnitude = function() {
        return Math.sqrt(x * x + y * y + z *z);
   }
}

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