L'empreinte mémoire du premier sera toujours plus grande. Considérez prototype
comme un paquet partagé de méthodes que toutes les instances peuvent utiliser. C'est efficace car vous ne créez pas de nouvelle fonction pour chaque instance, mais vous réutilisez la méthode existante déjà en mémoire.
Les bonnes nouvelles sont que les deux manières que vous avez montrées peuvent être combinées. Mais dans la mesure où vous avez affaire à une petite base de code, vous ne devriez pas vous soucier de l'utilisation de la mémoire. Vous pouvez même utiliser des modèles comme
// everything will be created for every
// instance, but the whole thing is nicely
// wrapped into one 'factory' function
myClass = function() {
// private variables
var x;
// private methods
function doSomethingWithX() {}
// public interface
return {
sayX: function() {
alert(x);
},
publicMethod: function() { .. },
// ...
};
};
Remarque, je intentionnellement changé myClass en minuscules, car il est plus une fonction constructeur et il n'y a pas besoin d'utiliser new
lors de l'appel!
MISE À JOUR - il y a un troisième motif qui convient bien à vos besoins:
MyClass = function (x, y, whatever) {
this._init.apply(this, arguments);
}
// The prototype creates a scope for data hiding.
// It also includes a constructor function.
MyClass.prototype = (function() {
var x; // private
return {
_init: function (x_in) {
x = x_in;
},
sayX: function() {
alert(x);
},
// ...
};
})();
Comme une note, vous pouvez utiliser [avec (ce) {}] (http://javascript.about.com/library/blwith.htm) si elle vous aide . –
NE PAS utiliser "avec". Il est dangereux à utiliser et sera supprimé des futures implémentations d'ECAMScript. Je ne peux pas trop insister sur ce point - il est préférable de prétendre que "avec" n'existe pas en JavaScript. – Hamish
Si vous le faites de la première façon, si vous faites un héritage, vous devrez être beaucoup plus prudent sur ce que vous faites, comment vous mélangez les deux techniques, quand vous appelez le super constructeur, etc. –