63 votes

Orienté objet, javascript à l'aide de prototypes vs fermetures

Je suis curieux de savoir quelle est la différence entre la suite de la programmation orientée objet en javascript techniques. Ils semblent faire la même chose, mais est considéré comme l'un meilleur que l'autre?

function Book(title) {
    this.title = title;
}

Book.prototype.getTitle = function () {
    return this.title;
};

var myBook = new Book('War and Peace');
alert(myBook.getTitle())

vs

function Book(title) {
    var book = {
        title: title
    };
    book.getTitle = function () {
        return this.title;
    };
    return book;
}

var myBook = Book('War and Peace');
alert(myBook.getTitle())

46voto

reko_t Points 22121

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

11voto

Skilldrick Points 33002

La première méthode est comment faire JavaScript a été conçu pour être utilisé. Cette dernière est la plus moderne technique, popularisé en partie par Douglas Crockford. Cette technique est beaucoup plus souple.

Vous pouvez aussi faire:

function Book(title) {
    return {
        getTitle: function () {
            return title;
        }
    }
}

L'objet retourné voudrais juste avoir un accesseur appelés getTitle, qui permettrait le retour de l'argument, tenue à la fermeture.

Crockford a une bonne page sur les députés d'en JavaScript - vaut vraiment le lire pour voir les différentes options.

5voto

Arman McHitaryan Points 847

C'est aussi un peu plus sur la réutilisation sous le capot. Dans le premier exemple avec l' Function.prototype propriété utilisation de toutes les instances du Livre de la fonction de l'objet de partager les mêmes copie de l' getTitle méthode. Tandis que le second extrait de rendre l' Book exécution de la fonction à créer et à maintenir dans le tas 'bibliothèque' des copies différentes d'un local closurable book objet.

function Book(title) {
    var book = {
        title: title
    };
    book.getTitle = function () {
        return this.title += '#';
    };
    return book;
}

var myBook = Book('War and Peace');
var myAnotherBook = Book('Anna Karenina');
alert(myBook.getTitle()); // War and Peace#
alert(myBook.getTitle()); // War and Peace##
alert(myAnotherBook.getTitle()); // Anna Karenina#
alert(myBook.getTitle());// War and Peace###

Le prototype de l'existence des membres de la seule copie de tous les new des occurrences de l'objet sur l'autre main. Donc, c'est une différence subtile entre eux qui n'est pas très évident à partir de la première soupir en raison de la fermeture de truc.

0voto

tsinik Points 383

voici un article à propos de ce en général Livre inharets du Livre.le prototype. Dans le premier exemple, vous ajouter une fonction pour getTitle Livre.prototype

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