是否可以选择不在构造函数中创建具有特定条件的对象,例如
function Monster(name, hp) {
if (hp < 1) {
delete this;
}
else {
this.name = name;
}
}
var theMonster = new Monster("Sulley", -5); // undefined
答案 0 :(得分: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);
答案 1 :(得分: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.设 result 是调用F的[[Call]]内部属性的结果,提供obj作为此值,并将传递给[[Construct]]的参数列表提供为< EM> ARGS
9. 如果Type(result)是Object,则返回结果。
10.返回obj。
然而,正如其他人所指出的那样,你是否应该这样做是值得怀疑的。
答案 2 :(得分:1)
没有意义,你试图在建造阶段停止建造物体。更好的方法是使用@Amberlamps建议的东西或使用工厂模式之类的东西来创建对象。