Question

Je suis en train de refactorisation mon code. Je vais avoir du mal à décider exactement comment mettre en œuvre un couple de fonctions utilitaires que j'ai. Plus précisément , si certaines fonctions sont mieux dans mon espace de noms personnel ou des objets directement étendant js.

Exemple de JavaScript extension native Objects

(est-ce le terme approprié?).

String.prototype.prettyDate = function(){
  return (this.substr(5,2) + '/' + this.substr(8) + '/' + this.substr(0,4));
}
var myString = "2010-12-27";
//logs 12/27/2010
console.log(myString.prettyDate);

Exemple avec mon propre espace de noms

var myNamespace = (function(){
   var my = {};
   my.prettyDate = function ( dateStr ){
      return (dateStr.substr(5,2) + '/' + dateStr.substr(8) + '/' + dateStr.substr(0,4));
   }
return my;
}());
var pretifiedDate = myNamespace.prettyDate('2010-12-27');
//logs 12/27/2010
console.log(pretifiedDate);

Questions à considérer

  1. Quand est un utilitaire à juste inséré dans un JavaScript natif objet?
  2. Comment puis-je savoir quand un utilitaire est mieux d'être dans mon propre espace de noms?
Était-ce utile?

La solution

  1. Presque jamais, en raison de:

    a / conflits possibles avec d'autres bibliothèques

    b / fonctions étendues sont itératives en tant que propriétés de opérateur, ce qui pose des problèmes à moins filtrés par hasOwnProperty (qui ne sont pas couramment utilisé)

    Vous pouvez justifier pour les petites œuvres d'un script, mais seulement si vous 200% sûr que personne, jamais va essayer de réutiliser quelque part que le code. Dans ce cas, l'utiliser uniquement pour la fonctionnalité qui enjambe plus d'un module de votre code. L'extension de chaîne avec trim () - ok, extension chaîne avec prettyDate () - douteux, l'extension objet avec displayAsPageHeader () -. Effrayant

  2. Alors, presque toujours.

Autres conseils

Regardez cette vidéo:

John Resig estime que l'extension des objets natifs est une recette pour un désastre, en particulier lorsqu'un cadre ou de l'application est susceptible de se transformer en quelque chose qui fait beaucoup plus que ce qui était initialement prévu.

Malheureusement, cette question n'a pas de réponse « droit ». Il est une bonne discussion d'avoir, mais je crains que ça va être fermé ici. Que ce soit des objets natifs devraient être étendus à tout un débat subjectif, et si vous acceptez qu'il est correct conditionnellement la réponse à « quand? » est "dépend".

Si vous avez le contrôle sur son utilisation et si elle entrer en collision avec un autre code, il n'y a vraiment aucune raison que vous ne devriez pas. Il peut être très pratique et peut réduire la taille du code de manière significative.

Là où il y a un vrai problème à l'extension des objets natifs est quand vous avez autre code en cours d'exécution à côté de votre extension, qui attend peut-être une autre extension avec le même nom de propriété, ou qui peut être négligemment en utilisant for(var i in obj) sans se prémunir contre des extensions jusqu'à la chaîne prototype.

Ok ... je ne suis pas expert, mais presque jamais! Les choses que vous faites sont plus sûrs à l'intérieur de votre espace de noms. Et tout fonctionne bien si vous suivez le modèle du module http: // www. yuiblog.com/blog/2007/06/12/module-pattern/

Cependant Theres quelques petits trucs qui nous permet d'éviter d'espace de noms Ecraser d'autres. par exemple:

var myNamespace = {}; //my namespace, unsafely written

//Better solution
if(typeof myNamespace === 'undefined'){
    var myNamespace = {};
}

//Shorter solution
var myNamespace = myNamespace || {};

Cela dépend de la façon dont le contrôle que vous avez sur ce code est en cours d'exécution / chargé:

  1. Si elle est sous votre contrôle, il est faux de rien à l'extension intégrée des objets, JavaScript est conçu pour être en mesure de le faire. Le seul problème avec ceci est que vous pouvez avoir des problèmes inattendus lorsque deux bibliothèques changent la même chose. Heureusement, vous ne seriez pas le faire pour vous, non?

  2. Si vous ne / ne pouvez pas savoir, un espace de noms est beaucoup plus sûr mais maladroit et bavard. Ceci est toujours plus sûr.

Personnellement, je préfère la deuxième option parce que je n'aime pas trop bavard code et namespaces drôle d'air.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top