是否有選項不在構造函數中使用特定條件創建對象,例如,不使用新構造函數創建對象
function Monster(name, hp) {
if (hp < 1) {
delete this;
}
else {
this.name = name;
}
}
var theMonster = new Monster("Sulley", -5); // undefined
是否有選項不在構造函數中使用特定條件創建對象,例如,不使用新構造函數創建對象
function Monster(name, hp) {
if (hp < 1) {
delete this;
}
else {
this.name = name;
}
}
var theMonster = new Monster("Sulley", -5); // undefined
我認爲你應該做的是拋出異常。 除非它明確地返回一個對象
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);
稱爲構造函數(與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。
但是,正如其他人所指出的那樣,你是否真的應該這樣做是值得懷疑的。
它沒有任何意義,您正試圖在施工階段停止施工對象。更好的方法是使用@Amberlamps建議的東西或使用類似工廠模式的東西來創建對象。
爲什麼不把你的狀態移動到你的「怪物」功能之外?無論如何,如果你不想讓它成爲一個對象,你就不能使用「theMonster」。你可以將'this.isMonster =(hp> = 1)'加到你的'Monster'函數中。 – Amberlamps 2013-03-12 07:58:34
拋出一個異常選項? – 2013-03-12 07:58:51