2013-03-12 13 views
6

Czy istnieje opcja nie tworzenia obiektu o określonym stanie w konstruktorze, np.nie tworzyć obiektu z nowym Konstruktorem

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

Dlaczego nie przenosisz swojego stanu poza funkcję "Potwora"? W każdym razie nie możesz użyć 'theMonster', jeśli nie chcesz, aby był obiektem. Możesz dodać 'this.isMonster = (hp> = 1);' do swojej funkcji 'Monster'. – Amberlamps

+3

rzuca wyjątek opcja? –

Odpowiedz

5

Myślę, że to, co powinniście zrobić, to wyrzucić wyjątek.

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

Funkcja zwana jako konstruktor (z operatorem new) będzie zawsze powrócić wystąpienie chyba że wyraźnie zwraca się obiekt. Można zatem powrócić pusty obiekt i użyć operatora instanceof sprawdzić co wrócił:

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

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

Takie zachowanie jest wyjaśnione w specyfikacji (13.2.2):

  8. Niech wynik być rezultatem wywoływania wewnętrznej właściwości F, podając obj jako wartość i dostarczając listę argumentów do [[Konstrukcja]] jako args.

  9. Jeśli Typ (wynik) to Obiekt, to zwróć wynik.

  10. Powrót obj.

Jednak, jak podkreślali inni, to, czy rzeczywiście należy to robić, jest wątpliwe.

+0

To błąd programowania, aby utworzyć potwora o ujemnym stanie zdrowia, dlaczego miałbyś zejść z drogi, aby uczynić go cichym i niemożliwym do wykrycia do końca, z całkowicie niepowiązanymi komunikatami o błędach. Wyrzucenie wyjątku jest jedyną rzeczą do zrobienia. – Esailija

+0

@Eailailija - Nie powiedziałem, że zgadzam się z podejściem, właśnie odpowiedziałem na pytanie ("Czy istnieje opcja, aby nie tworzyć obiektu o określonym stanie w konstruktorze?"). Dodałem notatkę, aby powiedzieć, że prawdopodobnie nie powinieneś tego robić. –

+0

To nie jest błąd, jeśli potwór jest nieumarłym ... jeśli wiesz co mam na myśli;) – WTK

1

To nie ma sensu, próbujesz zatrzymać konstrukcję obiektu podczas jego budowy. Lepszym sposobem byłoby użycie czegoś sugerowanego przez @Amberlamps lub użycie czegoś w stylu fabryk do tworzenia obiektów.

Powiązane problemy