我有像棋盘这样的对象数组,每个对象都有top
,down
,left
,right
函数返回对象邻居。
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
答案 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; }
};
}