我们有一些Foo对象
var Foo = function() {
this.bar = function(bazinga) {
if (bazinga) {return this;}
else {return false;}
}
this.show = function() {
alert('bar');
}
};
因此它允许我们做一些foo.bar().bar().bar().bar();
链。
但是如果在链的中间,bar()将返回false,则下一个bar()尝试将导致undefined has no method bar()
错误的错误。
那么如何使所有链返回false而不会出现任何错误的'ring'返回false?
答案 0 :(得分:3)
您必须更改条形的返回类型。我建议为此目的创建一种null对象,并在链的末尾添加一个finalization方法,该方法为null对象返回false:
var Foo = function() {
var nullFoo = function() {
this.finalize = function() { return false; }
this.bar = function() { return this; }
}
this.finalize = function() { return this; }
this.bar = function(bazinga) {
if (bazinga) {return this;}
else {return new nullFoo();}
}
this.show = function() {
alert('bar');
}
};
foo.bar().bar().bar().bar().finalize();
对于你的小提琴示例我没有使用finalize方法,而是给了null对象一个show方法。否则你最后仍会有false.show()
:
<强> Fiddle 强>
答案 1 :(得分:0)
这是你想要的:http://jsfiddle.net/c24w/MXgzx/5/
<强> JavaScript的:强>
var Foo = function() {
var returnValue = true;
this.bar = function(bazinga) {
returnValue = returnValue && bazinga;
return this;
}
this.show = function() {
alert('bar');
return returnValue;
}
};
答案 2 :(得分:0)
方法链可能有点危险。这完全与依赖关系有关。
使用方法链接时,最好注意链的每个部分返回的对象。
如果它们不完全相同,例如它们不是所有字符串,那么将链分解为单独的语句是个好主意。或者可能将它们提取到一个单独的函数中。
假设您有一些链,例如
somearray.pop().getATagWrapper().getTag().setSrc("http://www.stackoverflow.com")
链的隐式依赖项是Array,Object1,TagWrapper,Tag,String
现在您编写的函数现已耦合到所有这些对象,对这些对象的任何更改都可能会破坏您的代码。
好像我们看看
someString.trim().substr(12).trim().concat("with awesome")
所有只处理String对象。
有关详细信息,请参阅Law of Demeter