Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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_Design Patterns - Fatal编程技术网

Javascript 阻止构造函数

Javascript 阻止构造函数,javascript,design-patterns,Javascript,Design Patterns,我正试图在一个项目的库中实现一种构造函数模式。但是,我想在返回对象之前检查是否传递了某些条件。如果不满足这些条件,那么我想停止构造函数并返回false 但是,我注意到,无论我将什么设置为返回值,都会返回一个对象 即使我这样做: new function () { return false; } 结果仍然是一个对象对象: 镀铬: 在Firefox中: 有没有办法让Javascript中的构造函数失败? 如果不满足这些条件,那么我想停止构造函数并返回false 你不能。构造函数的返回值将被忽略

我正试图在一个项目的库中实现一种构造函数模式。但是,我想在返回对象之前检查是否传递了某些条件。如果不满足这些条件,那么我想停止构造函数并返回
false

但是,我注意到,无论我将什么设置为返回值,都会返回一个对象

即使我这样做:

new function () { return false; }
结果仍然是一个
对象
对象:

镀铬:

在Firefox中:

有没有办法让Javascript中的构造函数失败?

如果不满足这些条件,那么我想停止构造函数并返回false

你不能。构造函数的返回值将被忽略,除非它是非空对象。任何原语值(或
null
)都会被
新表达式忽略

如果确实想要返回一个标志值,可以这样做,但它必须是一个对象。(但这是个坏主意,下面将详细介绍。)例如:

//构造函数
函数Foo(num){
如果(数值<27){
return Foo.BAD_ARG;//这不是一个好主意,请参见下面的正确方法
}
this.num=num;
}
Foo.BAD_ARG={};//我们特殊的“坏论点”对象
有没有办法让Javascript中的构造函数失败

是:引发异常:

function Foo(num) {
    if (num < 27) {
        throw "`num` must be >= 27";
    }
    this.num = num;
}
函数Foo(num){
如果(数值<27){
抛出“`num`必须大于等于27”;
}
this.num=num;
}

返回非对象的唯一方法是将构造函数包装在函数中,并使用
new
为您调用(或不调用)

为此,需要禁止外部功能上的新功能


您甚至可以使用相同的函数,只要您从不使用
new
调用它

function Foo() {
   if (!(this instanceof Foo)) {
       if (some_condition)
           return false;
       else
           return new Foo()
   }
   // your constructor code here
}

var x = Foo();
如果您忘记并意外使用了
new
,则会有危险。要解决此问题,可以使用单独的函数

function Foo() {
    // constructor code
}

function Bar() {
    if (this instanceof Bar)
        throw "Not a constructor"

    if (some_condition)
         return false;
    else
        return new Foo();
}

从堆栈中抛出错误,例如

function thing(){
    throw new Error('nope');
}

try {
    var mine = new thing();
}
catch( e ){
    mine = null;
}

// mine is null
您还可以使用工厂方法,如:

createThing = function(){
   var obj = new thing();
   if( obj.feelsOK ){
       return obj;
   }
}

mine = createThing();
// mine is null

这就是我后来开始做的事情。但是,T.J.Crowder的答案更接近我想要的。谢谢你的解决方案。我有一个构造函数,它有一个
catch
块,但它并没有停止构造。你能看看并告诉我我遗漏了什么吗?@Martin:你不想在构造函数中捕捉异常,这就是重点。在构造函数中抛出异常,这会阻止正常返回,从而阻止调用代码获取对新创建对象的引用。您在调用构造函数的代码(或调用它的代码等)中处理异常,而不是在构造函数中处理异常。但这不会占用大量内存吗?我不希望创建一个带有额外标志的对象来显示它是无用的。。我想完全停止施工。像这样()的东西可以用,不是吗?@马丁:什么记忆?什么旗帜?只需抛出一个异常以响应异常条件。没有明显的内存影响,没有特殊标志。调用构造函数的代码要么得到一个正确的、无标志的对象,要么得到一个它必须处理的异常。
createThing = function(){
   var obj = new thing();
   if( obj.feelsOK ){
       return obj;
   }
}

mine = createThing();
// mine is null