2013-03-12 110 views
6

是否有選項不在構造函數中使用特定條件創建對象,例如,不使用新構造函數創建對象

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

爲什麼不把你的狀態移動到你的「怪物」功能之外?無論如何,如果你不想讓它成爲一個對象,你就不能使用「theMonster」。你可以將'this.isMonster =(hp> = 1)'加到你的'Monster'函數中。 – Amberlamps 2013-03-12 07:58:34

+3

拋出一個異常選項? – 2013-03-12 07:58:51

回答

5

我認爲你應該做的是拋出異常。 除非它明確地返回一個對象

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

稱爲構造函數(與new運營商)函數總是會返回一個實例。因此,您可以返回一個空的對象,並使用instanceof運營商檢查什麼回來:

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

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

此行爲規範(13.2.2)解釋說:

  8.讓結果是調用F的[[Call]]內部屬性的結果,提供obj作爲該值,並提供傳遞給[[Construct]]的參數列表參數

  9. 如果Type(結果)是Object,則返回結果

  10. Return obj。

但是,正如其他人所指出的那樣,你是否真的應該這樣做是值得懷疑的。

+0

創建一個負面健康的怪物是一個編程錯誤,爲什麼你會用自己的方式讓它保持沉默和不可發現的狀態,直到後來發生完全不相關的錯誤信息。拋出異常是唯一要做的事情。 – Esailija 2013-03-12 08:03:27

+0

@Esailija - 我沒有說我同意這個方法,我只是回答了這個問題(「是否有一個選項不能在構造函數中創建具有特定條件的對象?」)。我添加了一個說明,說你可能不應該這樣做。 – 2013-03-12 08:04:16

+0

如果怪物不死,這不是一個錯誤......如果你知道我的意思;) – WTK 2013-03-12 08:04:17

1

它沒有任何意義,您正試圖在施工階段停止施工對象。更好的方法是使用@Amberlamps建議的東西或使用類似工廠模式的東西來創建對象。

相關問題