Crockford a fait beaucoup pour vulgariser les bonnes techniques JavaScript. Sa position d'opinion sur les éléments clés du langage a suscité de nombreuses discussions utiles. Cela dit, il y a beaucoup trop de gens qui prennent chaque proclamation de «mauvais» ou de «nuisible» comme évangile, refusant de regarder au-delà de l'opinion d'un seul homme. Cela peut parfois être un peu frustrant.
L'utilisation de la fonctionnalité fournie par le new
mot - clé présente plusieurs avantages par rapport à la construction de chaque objet à partir de zéro:
- Héritage du prototype . Bien que souvent considérée avec un mélange de suspicion et de dérision par ceux habitués aux langages OO basés sur les classes, la technique d'héritage native de JavaScript est un moyen simple et étonnamment efficace de réutilisation du code. Et le nouveau mot-clé est le moyen canonique (et uniquement multiplateforme disponible) de l'utiliser.
- Performance. Ceci est un effet secondaire de # 1: si je veux ajouter 10 méthodes à chaque objet que je crée, je pourrais simplement écrire une fonction de création qui attribue manuellement chaque méthode à chaque nouvel objet ... Ou, je pourrais les affecter à la fonction de création
prototype
et utiliser new
pour éradiquer de nouveaux objets. Non seulement cela est plus rapide (aucun code n'est nécessaire pour chaque méthode du prototype), mais cela évite de gonfler chaque objet avec des propriétés distinctes pour chaque méthode. Sur des machines plus lentes (ou en particulier des interprètes JS plus lents), lorsque de nombreux objets sont créés, cela peut signifier des économies importantes de temps et de mémoire.
Et oui, new
a un inconvénient crucial, bien décrit par d'autres réponses: si vous oubliez de l'utiliser, votre code se cassera sans avertissement. Heureusement, cet inconvénient est facilement atténué - ajoutez simplement un peu de code à la fonction elle-même:
function foo()
{
// if user accidentally omits the new keyword, this will
// silently correct the problem...
if ( !(this instanceof foo) )
return new foo();
// constructor logic follows...
}
Maintenant, vous pouvez avoir les avantages de ne new
pas avoir à vous soucier des problèmes causés par une mauvaise utilisation accidentelle. Vous pouvez même ajouter une assertion à la vérification si la pensée de travailler en silence vous dérange. Ou, comme certains l'ont commenté, utilisez la vérification pour introduire une exception d'exécution:
if ( !(this instanceof arguments.callee) )
throw new Error("Constructor called as a function");
(Notez que cet extrait de code peut éviter de coder en dur le nom de la fonction constructeur, car contrairement à l'exemple précédent, il n'a pas besoin d'instancier réellement l'objet - par conséquent, il peut être copié dans chaque fonction cible sans modification.)
John Resig explique en détail cette technique dans son article sur l' instanciation "Classe" simple , ainsi que l'inclusion d'un moyen d'intégrer ce comportement dans vos "classes" par défaut. Vaut vraiment la peine d'être lu ... tout comme son livre à venir, Secrets of the JavaScript Ninja , qui trouve de l'or caché dans cela et dans de nombreuses autres fonctionnalités "nuisibles" du langage JavaScript (le chapitre sur with
est particulièrement instructif pour ceux d'entre nous qui ont initialement rejeté cette fonctionnalité tant décriée comme un gadget).