La différence est principalement que dans votre deuxième exemple, vous utilisez l'expression de fonction en tant que Constructor, l'opérateur new
provoquera la fonction à exécuter automatiquement, et la valeur this
dans cette fonction fera référence à un objet nouvellement créé .
Si vous ne renvoyez rien (ou si vous ne renvoyez pas une valeur non primitive) à partir de cette fonction, la valeur this
sera renvoyée et affectée à votre variable singleton
.
méthodes privilégiées peuvent également être utilisés dans votre deuxième exemple, un modèle commun est d'utiliser un immediately invoked function expression, la création d'un closure où les privés membres sont accessibles, vous pouvez retourner un objet qui contient votre API publique, par exemple :
var singleton = (function() {
var privateVar = 1;
function privateMethod() {/*...*/}
return { // public API
publicMethod: function() {
// private members are available here
}
};
})();
Je suis confus becau Le corps de votre question ne correspond pas à ce qui est demandé dans le titre. C'est un peu dommage car j'aimerais vraiment savoir ce qui se passe si vous appelez nouveau sur un singleton. Principalement, que se passe-t-il lorsque vous faites quelque chose comme ceci: var singleton = new (function() {return function() {};})(); La nouvelle est-elle appliquée à cette fonction retournée? – Bob
Je suppose que nous ne voulons pas dire la même chose par 'singleton'. Pour ce qui est de votre question, regardez la réponse de CMS ci-dessous: "le nouvel opérateur provoquera l'exécution automatique de la fonction, et cette valeur à l'intérieur de cette fonction se référera à un objet nouvellement créé Si vous ne retournez rien (ou vous ne renvoyez pas une valeur non-primitive) à partir de cette fonction, cette valeur sera retournée et assignée à votre variable singleton. " –
Un singleton est une instance unique d'un objet, il n'a pas besoin du nouvel opérateur. Au moins, c'est ce que certaines personnes utilisent le terme pour désigner JavaScript. Si vous avez une définition différente, c'est cool. Quant à cet extrait de code que j'ai posté: je l'ai essayé et il a échoué. Depuis l'encapsulation de la fonction entre parenthèses et l'ajout de(), la fonction est exécutée et un objet est retourné immédiatement, de sorte que le nouveau ne fonctionne pas sur un objet. – Bob