57 votes

JavaScript: The Good Parts - Comment ne pas utiliser «new» du tout

Crockford du livre, JavaScript: Les Bonnes Parties, dit (à la page 114) que les fonctions constructeur doit toujours être donné les noms avec une majuscule initiale (ie. Point), et que les noms de fonction avec des majuscules initiales doivent uniquement être utilisés avec les fonctions constructeur (tout le reste doit être en minuscules).

Cette convention nous permet de ne pas oublier d'utiliser l' new de l'opérateur avec les fonctions constructeur.

Il poursuit en disant que "[un]n même la meilleure stratégie est de ne pas utiliser new ."

Ma question est, comment pouvons-nous programme JavaScript sans utiliser new ?

  • Nous pouvons éviter new Object() et new Array() avec le littéral {} et [].
  • Nous pouvons éviter new Number(), new Boolean(), et new String() avec 0, true et ''.
  • Nous pouvons éviter new RegExp() avec quelque chose comme /pattern/.

Comment faire pour éviter new Date()?

Et, plus important encore, comment pouvons-nous éviter d'utiliser des new avec nos propres Objets personnalisés?

42voto

Mörre Points 2625

Crockford donne un exemple pour un objet de la création de la fonction que doit avoir été fourni par JS lui-même dans une de ses Javascript pourparlers disponible sur http://developer.yahoo.com/yui/theater/

Cependant, l'YUI(3) l'équipe elle-même utilise des "nouveaux", et ils NE suivent ses recommandations (puisqu'il est le chef d'Yahoo JS architecte (mise à JOUR: il est passé, mais l'énoncé est vrai quand cette réponse a été écrit à l'origine). Je comprends cette déclaration pour être plus "académique", ce qui aurait EU la langue été conçu "droit" et non avec quelques restes de la classe de base de l'héritage des trucs. Il (à mon humble avis à juste titre) dit que la façon dont il s'est avéré JS est source de conflits, prototype, mais avec ce quelque chose de "classique de classe" l'héritage des langues.

Cependant, le JS est qu'il est tellement aller et utiliser "nouveaux".

Vous pouvez trouver son objet en fonction de création ici: http://javascript.crockford.com/prototypal.html

 if (typeof Object.create !== 'function') {
     Object.create = function (o) {
         function F() {}
         F.prototype = o;
         return new F();
     };
 }
 newObject = Object.create(oldObject);

EDIT: mis à Jour pour utiliser Crockford la dernière version de cette fonction il y a trois.

12voto

Sean McMillan Points 5096

Je ne sais pas comment faire pour éviter new Date() ou new XMLHttpRequest() . Mais je ne sais comment l'éviter à l'aide de nouveau pour mes propres types.

Tout d'abord, je commence par Object.create(). C'est un ES5 méthode, il n'est donc pas disponible partout. J'ai ajouter à l'aide de l' es5-shim, annonce alors je suis prêt à aller.

J'aime le motif de module, j'ai donc commencer par emballage de mon type dans une auto-exécution de la fonction anonyme, var Xyz = (function() {...})(). Cela signifie que j'ai un espace privé à travailler sans faire de dégâts dans l'espace de noms global. Je retourne un objet avec un create() de la fonction, et un prototype de la propriété. l' create() fonction est pour les utilisateurs de mon type. Quand ils veulent, ils l'appellent Xyz.create(), et de revenir une nouvelle, initialisé à l'objet de mon type. L' prototype de la propriété est disponible que si les gens veulent hériter.

Voici un exemple:

var Vehicle = (function(){
        var exports = {};
        exports.prototype = {};
        exports.prototype.init = function() {
                this.mph = 5;
        };
        exports.prototype.go = function() {
                console.log("Going " + this.mph.toString() + " mph.");
        };

        exports.create = function() {
                var ret = Object.create(exports.prototype);
                ret.init();
                return ret;
        };

        return exports;
})();

et à l'héritage ressemble à ceci:

var Car = (function () {
        var exports = {};
        exports.prototype = Object.create(Vehicle.prototype);
        exports.prototype.init = function() {
                Vehicle.prototype.init.apply(this, arguments);
                this.wheels = 4;
        };

        exports.create = function() {
                var ret = Object.create(exports.prototype);
                ret.init();
                return ret;
        };

        return exports; 

})();

10voto

Raynos Points 82706

Ne pas utiliser new et aveuglément à la suite de Crockford est stupide.

Comprendre le JavaScript et écrire du bon code. À l'aide de l' new mot-clé est la pierre angulaire de JavaScript OO.

Vous allez manquer beaucoup de bon code JavaScript en évitant new.

Plutôt que de manière arbitraire la coupe d'énormes morceaux de votre boîte à outils, l'apprendre et l'utiliser correctement à la place.

Crockford a l'habitude de dire que rien en JavaScript qui lui a donné un bug dans son code est mauvais.

Personnellement, je ne dire que , "[u]même la meilleure stratégie est d'être compétent."

6voto

Jordão Points 29221

Vous pouvez éviter les new en créant des fonctions d'usine:

 var today = Date.getToday();
 

(Au cas où vous vous le demanderiez, vous ne pouvez pas l' éviter sur la fonction usine elle-même :)

 Date.getToday = function() { return new Date(); };
 

Bien que je pense seulement que vous devriez créer de telles fonctions si cela ajoute une valeur sémantique (comme dans le cas ci-dessus) ou si vous pouvez utiliser certains paramètres du constructeur par défaut. En d'autres termes, ne le faites pas simplement pour éviter d' utiliser new .

5voto

Stephen Points 5339

Cette question a déjà été posée et répondue: le "nouveau" mot clé de JavaScript est-il considéré comme nuisible?

Comme Raynos l'a dit, suivre aveuglément Crockford (ou qui que ce soit d'autre) sans comprendre pourquoi ils disent ce qu'ils font, c'est idiot.

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