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