2013-03-04 51 views
3

我有一些對象像棋盤,他們每個人都有top,down,left, right函數返回對象鄰居。JS - 停止對象鏈接沒有錯誤

data.field(3,3).left() //returns field(2,3); 

我可以連它像

data.field(3,3).left().left().top().right().down().getName();

但與負線沒有對象像

data.field(-1,0)

它容易當給定線爲負數或更大的檢測比對象數組。您可以返回false或空的對象 - 但如果還有什麼返回並鏈接繼續有錯誤

Uncaught TypeError: Object #<error> has no method 'down' 

這是OFC的事情,但我怎樣才能避免這種錯誤,並停止長鏈時,有沒有對象返回沒有得到阻止js執行的錯誤?

比方說:

data.left().left()/*here there is nothing to return*/.right().right().getName(); //should return false 
+0

你想讓鏈跳過無效呼叫並繼續鏈接,就好像什麼都沒發生一樣? – jbabey 2013-03-04 18:57:48

+0

那麼,你希望整條線最終返回什麼?你可能會返回一個具有方法但沒有數據的「假」對象嗎? – 2013-03-04 19:02:32

+1

可以說我已經有100個物品鏈在第10步返回false。我希望所有的鏈都返回false(並且出於性能方面的原因,如果在false後停止執行90個元素) – OPOPO 2013-03-04 19:13:23

回答

2

,而不是返回空值的位置無效的,返回一個自定義的「空對象」,它覆蓋的定向功能,只返回一個空的對象與返回「無效位置的getName功能「,或者在調用這些函數時引發異常。

nullObject = { 

    this.left = function(){return this;} 
    this.right = function(){return this;} 
    //etc 
    this.getName = function(){"Invalid Location"} 

} 

異常處理看起來是這樣的

try{ 
    piece.left().right().down().getName() 
} 
catch(exc){ 
    //handle exception 
} 

順便說一句,你基本上在這裏創造一個單子。如果你讓它在收到空對象時停止計算,那麼這就是maybe monad的一個例子。儘管這裏有一些理論水平高於實際的關注點。

+0

當調用的函數不存在時,無法檢查任何內容 – OPOPO 2013-03-04 19:48:49

+0

oh sorry。所以不要返回null,返回一個特殊類型的對象,它是一個可以檢查的無效對象。 – 2013-03-04 19:53:21

0

try/catch結構允許您在沒有任何返回的情況下停止執行。但是,如果您不想使用try/catch,則每個方法都必須能夠返回擁有返回對象本身的相同方法的對象。在這種情況下,鏈將被完全執行:

right: function() { 
    var nextItem; 
    // get next item to the right here 
    return nextItem || { 
     up: function() { return this; }, 
     right: function() { return this; }, 
     down: function() { return this; }, 
     left: function() { return this; } 
    }; 
} 
相關問題