Le second n'a pas vraiment de créer une instance, il retourne simplement un objet. Cela signifie que vous ne pouvez pas profiter des opérateurs comme instanceof
. Par exemple. avec le premier cas, vous pouvez le faire if (myBook instanceof Book)
pour vérifier si la variable est un type de Livre, tandis que dans le deuxième exemple, ce serait un échec.
Si vous souhaitez spécifier vos méthodes de l'objet dans le constructeur, ce est la bonne façon de le faire:
function Book(title) {
this.title = title;
this.getTitle = function () {
return this.title;
};
}
var myBook = new Book('War and Peace');
alert(myBook.getTitle())
Alors que dans cet exemple, les deux se comportent exactement de la même manière, il y a des différences. Avec la fermeture de la base de la mise en œuvre, vous pouvez avoir privé de variables et de méthodes (il suffit de ne pas les exposer dans l' this
objet). Si vous pouvez faire quelque chose comme:
function Book(title) {
var title_;
this.getTitle = function() {
return title_;
};
this.setTitle = function(title) {
title_ = title;
};
// should use the setter in case it does something else than just assign
this.setTitle(title);
}
Code de l'extérieur du Livre de la fonction ne peut pas accéder à la variable de membre directement, elles doivent utiliser les accesseurs.
Autre grande différence, c'est la performance; un Prototype basé le classement est généralement beaucoup plus rapide, en raison de certains frais généraux inclus dans l'aide de fermetures. Vous pouvez lire sur les différences de performances dans cet article: http://blogs.msdn.com/b/kristoffer/archive/2007/02/13/javascript-prototype-versus-closure-execution-speed.aspx