2011-03-01 17 views
27

Si tengo una clase de JavaScript que no se puede crear una instancia, ¿qué devolverá el constructor que pueda probar? El constructor siempre devuelve un objeto, por lo que no puedo devolver nulo si el constructor falla.¿Qué debería devolver un constructor de JavaScript si falla?

function SomeClass(id) { 
    if(typeof(id) === 'number' { 
    // This is good 
    this.id = id; 
    } else { 
    // This is bad 
    // This return is ignored and an empty object is returned 
    return null; 
    } 
} 

var a = new SomeClass('badParam'); 
if(a){ 
    // is true even though the class expects a number. 
} 

// Could use this check 
if(a.id !== undefined){ 
    // Do some stuff 
} 

pero parece que debería haber una manera mejor.

+0

Devolvería indefinido – Paul

Respuesta

26

Probablemente sea mejor lanzar una excepción para notificar a la persona que llama que la inicialización falló y tomar las medidas adecuadas.

Los códigos de retorno están bien, pero en su mayor parte no hay ninguna motivación para que la persona que llama implemente las verificaciones en el código de retorno.

Mi consejo es romper duro y romper pronto. Esto hará que las violaciones de contrato sean muy evidentes durante la prueba.

21

Devolver cualquier no objeto del constructor es prácticamente lo mismo que salir del constructor. (El constructor devolverá un nuevo objeto, con un prototype si se ha especificado uno.)

Así, volviendo null, undefined o 42 desde el constructor son equivalentes.

Consulte la sección 13.2.2 del ECMAScript spec (pdf) para obtener más información.

+2

+1 Por explicar el comportamiento. –

+1

La especificación ECMAScript ha cambiado desde esta respuesta y la sección 13.2.2 ya no está relacionada con esta conversación. –

10

Mi primer acercamiento:

  1. No permita que un constructor falle; considerar alternativas

Mi segundo enfoque:

  1. Si un constructor falla, sólo debe fallar debido a un error de programación y de esta manera;
  2. debe lanzar una excepción y;
  3. no debe volver 'un código de estado' (véase la respuesta de Emmett por qué volver null no funciona de todos modos)

nunca he diseñado un constructor (algo que se invoca como el blanco de new) para volver cualquier cosa excepto un objeto del tipo "esperado".

Fail fast, evite ser too inteligente, y ahorre tiempo eliminando errores difíciles de encontrar.

Happy coding.

1

Usar I sentinel. Me gusta

return {invalid:true}; 

Esto se ve limpio:

var x = new X(); 
if (x.invalid) { // ... 

(No hay manera de devolver un valor que no sea verdadero de un constructor, por lo que no se puede poner nueva en condicional a medida que podría con otro idioma.)

Cuestiones relacionadas