2013-03-12 11 views
6

Esiste un'opzione per non creare un oggetto con condizioni particolari all'interno del costruttore, ad es.non creare un oggetto con il nuovo Costruttore

function Monster(name, hp) { 
    if (hp < 1) { 
     delete this; 
    } 
    else { 
      this.name = name; 
    } 
} 
var theMonster = new Monster("Sulley", -5); // undefined 
+2

Perché non spostate le vostre condizioni al di fuori della funzione 'Mostro'? Non puoi comunque usare 'theMonster' se non vuoi che sia un oggetto. Si potrebbe aggiungere 'this.isMonster = (hp> = 1);' alla funzione 'Mostro'. – Amberlamps

+3

lancia un'opzione di eccezione? –

risposta

5

Penso che quello che dovresti fare è fare un'eccezione.

function Monster(name, hp) { 
    if (hp < 1) { 
     throw "health points cannot be less than 1"; 
    } 
    this.hp = hp; 
    this.name = name; 
} 

var m = new Monster("Not a good monster", 0); 
4

Una funzione chiamata come un costruttore (con l'operatore new) sarà sempre restituire un'istanza meno restituisce esplicitamente un oggetto. È quindi possibile restituire un oggetto vuoto, e utilizzare l'operatore instanceof per controllare quali è tornato:

function Monster(name, hp) { 
    if (hp < 1) { 
     return {}; 
    } 
    else { 
     this.name = name; 
    } 
} 
var theMonster = new Monster("Sulley", -5); 

console.log(theMonster instanceof Monster); // false 

Questo comportamento è spiegato nella specifica (13.2.2):

  8. Let risultato essere il risultato di chiamare la proprietà interna [[Call]] di F, fornendo obj come questo valore e fornendo l'elenco degli argomenti passato in [[Construct]] come args.

  9. Se Tipo (risultato) è Oggetto, restituire il risultato.

  10. Oggetto di reso.

Tuttavia, come altri hanno sottolineato, se si dovrebbe effettivamente fare questo è discutibile.

+0

Si tratta di un errore di programmazione per creare un mostro con problemi di salute, perché dovresti fare in modo di renderlo silenzioso e inaffidabile fino a più tardi con messaggi di errore completamente indipendenti. Lanciare un'eccezione è l'unica cosa da fare. – Esailija

+0

@Esailija - Non ho detto che sono d'accordo con l'approccio, ho appena risposto alla domanda ("Esiste un'opzione per non creare un oggetto con condizioni particolari all'interno del costruttore?"). Ho aggiunto una nota per dire che probabilmente non dovresti farlo. –

+0

Non è un errore se il mostro non è morto ... se sai cosa intendo;) – WTK

1

Non ha senso, si sta tentando di interrompere la costruzione di un oggetto durante la sua fase di costruzione. Il modo migliore sarebbe usare qualcosa suggerito da @Amberlamps o usare qualcosa come il modello di fabbrica per creare oggetti.

Problemi correlati