3

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

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
4

2 回答 2

2

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

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。如果你让它在接收到 null 对象时停止计算,那么这就是可能 monad的一个例子。不过,这比这里的实际问题高出几个理论水平。

于 2013-03-04T18:56:09.787 回答
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; }
    };
}
于 2013-03-05T08:59:22.267 回答