2010-02-12 3 views
1

En javascript, quelle est la différence entre:Initialisation d'objets javascript singleton à l'aide du nouvel opérateur?

var singleton = function(){ ... } 

et

var singleton = new function(){ ... } 

?

La déclaration de fonctions privilégiées comme décrit par crockford (http://www.crockford.com/javascript/private.html) fonctionne uniquement avec ce dernier.

+0

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

+0

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. " –

+0

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

Répondre

5

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 
    } 
    }; 
})(); 
+0

Bonne réponse! +1 –

+0

vous l'avez cloué ... –

0

Je pense qu'une fonction privilégiée telle que décrite par Crockford ressemblerait à ceci:

function Test() { 
    this.privileged = function() { 
      alert('apple'); 
    } 
    function anonymous() { 
     alert('hello'); 
    } 
    anonymous(); 
} 

t = new Test; // hello 
t.privileged(); // apple 

// unlike the anonymous function, the privileged function can be accessed and 
// modified after its declaration 

t.privileged = function() { 
    alert('orange'); 
} 

t.privileged(); // orange 
+1

C'est une fonction privilégiée en effet, mais pas un singleton. –

Questions connexes