Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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 Planet(solarSystem,habitable) { this.solarSystem = solarSystem; this.habitable = habitable; } 我想创建这个构造函数的一个实例,但我输入了错误的参数类型(例如,因为我喝了4杯啤酒,我想编程): 问题:如何调整实例的创建条件,以便如果参数类型得到尊重-->实例已创建,否则不向earth 编辑:我忘记指定我期望的是一个行星(字符串,布尔)参数类型有

假设我有以下构造函数

function Planet(solarSystem,habitable) {

    this.solarSystem = solarSystem;
    this.habitable = habitable;

}
我想创建这个构造函数的一个实例,但我输入了错误的参数类型(例如,因为我喝了4杯啤酒,我想编程):

问题:如何调整实例的创建条件,以便如果参数类型得到尊重-->实例已创建,否则不向
earth


编辑:我忘记指定我期望的是一个
行星(字符串,布尔)
参数类型

有一些解决方案:

  • 返回一个没有任何属性的对象
功能行星(太阳系,可居住){
if(太阳能系统的类型!='string'&&typeof habitable!='boolean'){
返回Object.create(null);
}
this.solarSystem=solarSystem;
this.habitable=宜居;
}
var planetObj1=新行星(“测试”,真);
console.log('planetObj1',planetObj1',是行星的实例,planetObj1是行星的实例);
var planetObj2=新行星(14,‘测试’);

log('planetObj2',planetObj2',是行星的实例,planetObj2是行星的实例)
您可以使用
代理
对象拦截现有构造函数并应用验证逻辑:

功能行星(太阳系,可居住){
this.solarSystem=solarSystem;
this.habitable=宜居;
}
const validate={//代理的处理程序
构造:函数(目标,参数){
让太阳系,宜居;
if(Array.isArray(args)&&args.length==2){
solarSystem=(参数类型[0]=“字符串”)?参数[0]:空;
可居住=(参数类型[1]=“布尔”)?参数[1]:空;
返回(solarSystem!==null和宜居!==null)
?{太阳能系统,可居住}
: {}
}否则{
return{}//如果参数不正确,则返回一个空对象
}
}
}
//新的构造器,用它来创造新的行星
const validPlanet=新代理(行星,验证);
//用法:常数a=新的有效平面(,)
//让我们使用初始错误构造函数:
const earth=新行星(“太阳”,真);
控制台日志('地球(行星):',地球);
常数错误=新行星('太阳',15);//这使用了初始构造函数,传递的值错误
console.log('错误(行星):',错误);
//现在让我们使用代理收缩器进行验证
常数冥王星=新有效行星(“太阳”,假);
console.log('pluto(validPlanet):',pluto);
const bad=new validPlanet('solar','hello');

console.log('bad(validPlanet):',bad);//返回一个空对象
JS此类验证的内置对象是代理对象:您可以抛出异常!不可能从构造函数返回未定义的。您必须将其包装到另一个creator函数中,该函数返回一个新的Planet或undefined/null,具体取决于参数。@wostex否,代理在这里完全没有帮助。我怎么知道应该尊重哪些参数类型?如果您要进行类型检查,请使用提供它的语言,如TypeScript。在您的示例中,如果
earth
未设置为任何值,您将如何继续运行程序?
let earth = new Planet(23, 'wooow');