Pregunta

Estoy en el proceso de refactorización mi código. Estoy teniendo problemas para decidir sobre la forma precisa para poner en práctica un par de funciones de utilidad que tengo. En concreto , si ciertas funciones están mejor en mi espacio de nombres personales o js que se extienden objetos directamente.

Ejemplo de extender JavaScript nativo Objetos

(este es el término correcto?).

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);

Ejemplo usando mi propio espacio de nombres

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);

Preguntas a considerar

  1. Cuando se inserta una utilidad justificadamente en un objeto JavaScript nativo?
  2. ¿Cómo puedo saber cuando una utilidad es mejor estar en mi propio espacio de nombres?
¿Fue útil?

Solución

  1. Casi nunca, debido a:

    A / posibles conflictos con otras bibliotecas

    b / funciones extendidas son iterados como propiedades por en operador, lo que plantea problemas a menos filtrados por hasOwnProperty (que no se utiliza comúnmente)

    Se puede justificar esto para pequeños trabajos, uno en secuencias de comandos, pero sólo si el 200% seguro de que nadie, nunca jamás va a tratar de volver a usar su código en algún lugar. En tal caso, sólo la utiliza para la funcionalidad que se extiende por más de un módulo de su código. La extensión de cadena con el ajuste () - está bien, que se extiende cadena con prettyDate () - dudosa, que se extiende con objeto displayAsPageHeader () -. Miedo

  2. Por lo tanto, casi siempre.

Otros consejos

Ver este vídeo:

reconoce John Resig que la extensión de los objetos nativos es una receta para el desastre, sobre todo cuando es probable que crezca en algo que hace mucho más que inicialmente tenía un marco o aplicación.

Por desgracia, esta pregunta no tiene una respuesta "correcta". Es una buena discusión para tener pero me temo que va a ser cerrado aquí. Si los objetos nativos deben extenderse a todos es un debate subjetiva, y si se acepta que es condicionalmente bien la respuesta a "¿cuándo?" es "depende".

Si usted tiene control sobre su uso y si va a colisionar con otro código, no hay realmente ninguna razón por la que no debería. Puede ser muy conveniente y puede reducir significativamente el tamaño del código.

Donde hay un problema real con la extensión de los objetos nativos es cuando tiene otro código que se ejecuta al lado de su extensión, que puede estar esperando una extensión diferente con el mismo nombre de la propiedad, o que puede estar sin cuidado usando for(var i in obj) sin protección contra las extensiones hasta la prototipo cadena.

Ok ... No soy experto en esto, pero casi nunca! Cosas que haces son más seguros dentro de su espacio de nombres. Y todo funciona bien si se sigue el patrón módulo http: // www. yuiblog.com/blog/2007/06/12/module-pattern/

Sin embargo theres algunos pequeños trucos que nos permite evitar la sobreescritura a otros espacio de nombres. por ejemplo:

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

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

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

Depende de la cantidad de control que tiene sobre lo que es el código que se ejecuta / carga:

  1. Si todo está bajo su control no hay nada malo con la extensión de los objetos incorporados, JavaScript está diseñado para ser capaz de hacer esto. El único problema con esto es que usted puede tener problemas inesperados cuando dos bibliotecas cambian la misma cosa. Afortunadamente, usted no haría esto a ti mismo, ¿verdad?

  2. Si no / no puede saber, un espacio de nombres es mucho más seguro aunque torpe y detallado. Esto siempre es más seguro.

En lo personal, yo prefiero la segunda opción porque me gusta demasiado prolijo código y espacios de nombres mirada divertida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top