2012-03-05 48 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中並不常用。