不要使用新的构造函数创建对象

时间:2013-03-12 07:53:00

标签: javascript

是否可以选择不在构造函数中创建具有特定条件的对象,例如

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

3 个答案:

答案 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建议的东西或使用工厂模式之类的东西来创建对象。