Quoi de neuf avec une classe JavaScript dont le constructeur renvoie une fonction ou un objet

Lorsque j'utilise les new pour instaurer une instance d'une certaine classe, j'ai eu l'instance réelle. Lorsque la fonction constructeur a une valeur de retour, la new phrase donne également l'exemple réel. Cependant, lorsque le constructeur se retourne, je ne peux pas obtenir l'instance. Au lieu de cela, je reçois le constructeur. Je erre ce qui ne va pas avec ça.

Voici mon fragment de code de test:

 function foo() { this.x = 1; return foo; } console.log(new foo()); // prints the defination of foo 

Comme nous le considérons, dans la plupart des situations, il ne sert à rien de renvoyer une fonction comme celle-ci. Cependant, pourquoi JS a-t-elle une telle caractéristique? Y a-t-il une considération lors de la conception de JS? Ou est-ce juste un bug de JS?

Si vous renvoyez un objet à partir d'un constructeur, le résultat de la new ... expression sera l'objet que vous avez renvoyé:

 function myWackyConstructor() { return new Date(); } var d = new myWackyConstructor(); console.log(d); 

Votre code soulève un sourcil. Il n'a pas de sens pour moi pourquoi vous devriez retourner une classe statique dans votre constructeur.

Je pense que si vous avez renvoyé l'instance actuelle, cela pourrait avoir plus de sens pour vous, mais ce n'est pas nécessaire.

Exemple

 function foo() { this.x = 1; return this; } var aFooInstance = new foo(); console.log(aFooInstance); // prints a instance of foo 

Cependant, vous voudrez peut-être avoir des variables privées afin que vous puissiez retourner un objet de la sorte, dans cet exemple, vous pouvez également transmettre les données au constructeur.

 function foo(x) { var _x = x; this.getX = function(){ return _x;} } var aFooInstance = new foo(1); console.log(aFooInstance.getX()); // prints 1 

Je suggère de lire plus sur l' instanciation simple de classe .

Dans JS, lorsque nous déclarons une fonction en tant que classe et lorsque nous créons un objet de cette classe, cette fonction est appelée en premier.

Ne revenez pas de la fonction.

Le constructeur Javascript n'a pas besoin de retour. Cela fonctionnera: –

 function foo() { this.x = 1; } var myfoo = new foo(); console.log(myfoo.x);