91 votes

Quelles sont les valeurs que peut un constructeur de retour pour éviter de se retrouver?

Quelles sont les circonstances exactes pour lesquelles une instruction de retour en Javascript peut retourner une valeur autre que this quand un constructeur est appelé à l'aide l' new mot-clé?

Exemple:

function Foo () {
  return something;
}

var foo = new Foo ();

Si je ne me trompe pas, si something est un non-fonction primitive, this sera retourné. Sinon, something est retourné. Est-ce correct?

OIE, quelles valeurs peut - something prendre à cause (new Foo () instanceof Foo) === false?

163voto

CMS Points 315406

La condition exacte est décrite sur l' [[Construct]] intérieur de la propriété, qui est utilisé par l' new opérateur:

À partir de l'ECMA-262 3ème. Ediion Spécifications:

13.2.2 [[Construct]]

Lorsque l' [[Construct]] de la propriété pour un Function objet F est appelé, les mesures suivantes sont prises:

  1. Créer un nouveau natif ECMAScript objet.
  2. Définir l' [[Class]] de la propriété de l' Result(1) de "Object".
  3. Obtenir la valeur de la propriété prototype de la F.
  4. Si Result(3) est un objet, l' [[Prototype]] de la propriété de l' Result(1) de Result(3).
  5. Si Result(3) n'est pas un objet, l' [[Prototype]] de la propriété de l' Result(1) à la version originale Object prototype d'un objet tel que décrit dans 15.2.3.1.
  6. Invoquer l' [[Call]] de la propriété de l' F, en fournissant Result(1) le this la valeur et de fournir la liste des arguments passés en [[Construct]] que les valeurs de l'argument.
  7. Si Type(Result(6)) est Object puis de retour Result(6).
  8. De retour Result(1).

Regardez les étapes 7 et 8, le nouvel objet sera remboursée seulement si le type d' Result(6) (la valeur retournée par l' F fonction constructeur) n'est pas un Objet.

5voto

Gabriel McAdams Points 22323

Le mot-clé new crée un objet, puis appelle la fonction. Vous avez raison, vous pouvez retourner tout ce que vous voulez. Comme une question de fait, c'est une bonne façon de mettre en œuvre des membres public et privé. Voici un exemple:

function Foo() {
    var privateVariable1 = 'Hello';
    var privateVariable2 = 'World';

    function privateMethod() {
        //do stuff
    }

    return {
        publicVariable1 : null,
        publicVariable2 : 'bar',

        getString : function() {
            return privateVariable1 + ' ' + privateVariable2;
        }
    };
}

3voto

mkrause Points 543

Je ne pouvais pas trouver toute la documentation sur le sujet, mais je pense que vous avez raison. Par exemple, vous pouvez revenir new Number(5) à partir d'un constructeur, mais pas le littéral 5 (ce qui est ignoré et l' this est retourné à la place).

-1voto

Guffa Points 308133

Lorsque vous utilisez l' new mot-clé, la création d'un objet. Alors la fonction est appelée pour initialiser l'objet.

Il n'y a rien que la fonction peut faire pour prévenir l'objet en cours de création, comme cela est fait avant que la fonction est appelée.

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