Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不使用新构造函数创建对象_Javascript - Fatal编程技术网

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

Javascript 不使用新构造函数创建对象,javascript,Javascript,是否有选项不在构造函数中创建具有特定条件的对象,例如 function Monster(name, hp) { if (hp < 1) { delete this; } else { this.name = name; } } var theMonster = new Monster("Sulley", -5); // undefined 功能怪物(名称,hp){ 如果(hp

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

function Monster(name, hp) {
    if (hp < 1) {
       delete this;
    }
    else {
           this.name = name;
    }
}
var theMonster = new Monster("Sulley", -5); // undefined
功能怪物(名称,hp){
如果(hp<1){
删除此项;
}
否则{
this.name=名称;
}
}
var theMonster=新怪物(“萨利”,-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);
功能怪物(名称,hp){
如果(hp<1){
抛出“生命值不能小于1”;
}
this.hp=hp;
this.name=名称;
}
var m=新怪物(“不是好怪物”,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
功能怪物(名称,hp){
如果(hp<1){
返回{};
}
否则{
this.name=名称;
}
}
var theMonster=新怪物(“Sulley”,-5);
console.log(Monster的Monster实例);//假的
规范()中解释了这种行为:

八,。让result作为调用F的[[Call]]内部属性的结果,提供obj作为this值,并提供作为args传递到[[Construct]]的参数列表

九,如果类型(结果)是对象,则返回结果

十,。返回obj


然而,正如其他人所指出的,您是否真的应该这样做是值得怀疑的。

这没有意义,您试图在对象的构造阶段停止构造对象。更好的方法是使用@Amberlamps建议的方法或使用类似工厂模式的方法来创建对象。

为什么不将您的条件移动到
Monster
功能之外?如果您不想将其作为对象,则无论如何都不能使用
theMonster
。您可以添加
this.isMonster=(hp>=1)Monster
函数执行code>操作。抛出异常是一个选项吗?创建一个运行状况为负的怪物是一个编程错误,为什么你会特意让它保持沉默,直到稍后才发现完全不相关的错误消息。抛出异常是唯一要做的事情。@Esailija-我没有说我同意这种方法,我只是回答了这个问题(“是否有一个选项不在构造函数中创建具有特定条件的对象?”)。我已经添加了一条说明,说明你可能不应该这样做。如果怪物是不死生物,这不是一个错误。。。如果你知道我的意思;)我同意一个例外会更好,但是对于规范,无论如何+1