2012-03-05 36 views
0

如果某些标准不符合,是否可以取消在coffeescript中创建对象?我想要做这样的事情:Coffeescript对象创建验证

class Foo 
    constructor:(@name) -> 
    return false if !name 

withName = new Foo("bar") #withName -> obj 
noName = new Foo #noName -> false 

但与代码的对象仍然是创建。做这个的最好方式是什么?

回答

2

您需要检查调用站点的验证条件,在构造函数内部已经晚了。

在该类的编译的JavaScript看看:

Foo = (function() { 

    function Foo(name) { 
     this.name = name; 
     if (!name) return false; 
    } 

    return Foo; 

    })(); 

    withName = new Foo("bar"); 

    noName = new Foo; 

}).call(this); 

而且它应该是一个更加清楚一点,为什么它不工作。

new关键字发生之前构造函数被调用。

如何像这样(未测试)

runIf = (someVar, someDelegate) -> 
    someDelegate someVar if someVar 

withName = runIf "bar", -> new Foo("bar") 
noName = runIf null, -> new Foo() 

哪个编译为:

runIf = function(someVar, someDelegate) { 
    if (someVar) return someDelegate(someVar); 
    }; 

    withName = runIf("bar", function() { 
    return new Foo("bar"); 
    }); 

    noName = runIf(null, function() { 
    return new Foo(); 
    }); 
4

做到这一点的唯一方法是从构造函数抛出一个异常:

class Foo 
    constructor:(@name) -> 
    throw new Error('Name must be specified') if !name 

但是,作为一种风格问题,异常在JS中并不常用。