Comment fonctionne le nouvel opérateur en JavaScript?

Probablement la partie la moins comprise de JavaScript, debout à côté de la chaîne prototype.

La question est donc: comment …

new dataObj(args); 

… créer un objet et définir son prototype de chaîne / constructeurs / etc?

Le mieux est de montrer une alternative, pour bien comprendre ce mot-clé.

Le new opérateur utilise la méthode interne [[Construct]] , et il fait essentiellement ce qui suit:

  • Initialise un nouvel objet natif
  • Définit le [[Prototype]] interne [[Prototype]] de cet objet, pointant vers la propriété prototype Function.
    • Si la propriété prototype la fonction n'est pas un objet (valeurs primitives, comme un nombre, une chaîne, un booléen, un indéfini ou nul), Object.prototype est utilisé à la place.
  • Après avoir créé l'objet, il appelle la fonction, en fournissant l'objet comme valeur.
  • Si la valeur de retour de la fonction appelée est une primitive, l'objet créé en interne est renvoyé.
  • Sinon, si un objet est renvoyé, l'objet créé en interne est perdu.

Une implémentation équivalente de ce que fait le new opérateur peut s'exprimer comme ceci (en supposant que la méthode ECMAScript 5 Object.create est disponible):

 function NEW(f) { var obj, ret, proto; // Check if `f.prototype` is an object, not a primitive proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype; // Create an object that inherits from `proto` obj = Object.create(proto); // Apply the function setting `obj` as the `this` value ret = f.apply(obj, Array.prototype.slice.call(arguments, 1)); if (Object(ret) === ret) { // the result is an object? return ret; } return obj; } // Example usage: function Foo (arg) { this.prop = arg; } Foo.prototype.inherited = 'baz'; var obj = NEW(Foo, 'bar'); obj.prop; // 'bar' obj.inherited; // 'baz' obj instanceof Foo // true 

L'expression new C(arg1, arg2) :

En supposant que C soit une fonction JavaScript (sinon, vous obtenez une erreur):

  1. Crée un nouvel objet vide (sans propriétés)
  2. Définit le prototype du nouvel objet sur la valeur de la propriété " prototype " de C
    • Remarque: La valeur par défaut du prototype pour une fonction est un objet (créé automatiquement lorsque la fonction est déclarée) avec son prototype défini sur Object.prototype et une propriété constructor renvoyant à la fonction C
    • Remarque: la terminologie peut être source de confusion. La propriété nommée "prototype" n'est pas identique au prototype de l'objet. Seules les fonctions ont la propriété de "prototype", mais tous les objets ont un prototype.
  3. Appelle la fonction C avec ' this ' set sur le nouvel objet et avec les arguments fournis.
  4. Si l'appel de la fonction C renvoie un objet, cet objet est le résultat de l'expression. Sinon, l'objet nouvellement créé est le résultat de l'expression.

Une alternative à new dans ECMAScript 5 serait d'utiliser la méthode Object.createObject Object.createObject .

new C(arg1, arg2) équivaut à:

 var obj = Object.createObject(C.prototype); C.apply(obj, [arg1, arg2]); 

Standard JavaScript ne vous permet pas de définir explicitement le prototype d'un objet, donc Object.createObject ne peut pas être implémenté dans la langue elle-même. Certaines implémentations le permettent via la propriété non standard __proto__. Dans ce cas, le new C peut être simulé comme ceci:

 var obj = {}; obj.__proto__ = C.prototype; C.apply(obj, [arg1, arg2]);