JS - 停止对象链接而不会出错

时间:2013-03-04 18:51:50

标签: javascript oop

我有像棋盘这样的对象数组,每个对象都有topdownleftright函数返回对象邻居。

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'

这是什么事情,但我怎么能避免这个错误,并且当没有对象返回而没有得到阻止js执行的错误时停止长链?

让我们说:

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

2 个答案:

答案 0 :(得分:2)

不是为无效位置返回null,而是返回一个自定义“null对象”,该对象覆盖方向函数,只返回带有返回“invalid location”的getName函数的null对象,或者在调用这些函数时抛出异常

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
}

顺便说一下,你实际上是在这里创建一个monad。如果你有它在收到空对象时停止计算,那么这就是maybe monad的一个例子。这里有一些理论水平高于实际问题。

答案 1 :(得分: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; }
    };
}