如果某些标准不符合,是否可以取消在coffeescript中创建对象?我想要做这样的事情:Coffeescript对象创建验证
class Foo
constructor:(@name) ->
return false if !name
withName = new Foo("bar") #withName -> obj
noName = new Foo #noName -> false
但与代码的对象仍然是创建。做这个的最好方式是什么?
如果某些标准不符合,是否可以取消在coffeescript中创建对象?我想要做这样的事情:Coffeescript对象创建验证
class Foo
constructor:(@name) ->
return false if !name
withName = new Foo("bar") #withName -> obj
noName = new Foo #noName -> false
但与代码的对象仍然是创建。做这个的最好方式是什么?
您需要检查调用站点的验证条件,在构造函数内部已经晚了。
在该类的编译的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();
});
做到这一点的唯一方法是从构造函数抛出一个异常:
class Foo
constructor:(@name) ->
throw new Error('Name must be specified') if !name
但是,作为一种风格问题,异常在JS中并不常用。