我正在尝试为JavaScript项目创建一个类似fluent的API。
目前我有这样的事情:
function Foo(a, b) {
this.a = a;
this.b = b;
this.Set = function(attr, val) {
this[attr] = val;
return this;
},
this.refresh = function() {
//do something
}
};
这允许我写下以下内容:
var foo = new Foo("Hello", "World");
// foo = { a : "Hello", b : "World" }
foo.Set("c", "!");
// foo = { a : "Hello", b : "World", c : "!" }
foo.Set(...);
//...
编写流畅的API的好处是以菊花链方式调用,因此我可以更轻松,更可读地编写foo.Set(...).Set(...).Set(...)
编写基本API很好,但我想知道如何检测菊花链中的最后一个Set
调用,因为在此调用中我想调用refresh
。
我想这样做是为了避免用户需要手动附加.refresh()
。
有没有人处理过这样的事情?
谢谢, erip
修改
伪代码的期望效果:
function Foo(a, b) {
this.a = a;
this.b = b;
this.Set = function(attr, val) {
this[attr] = val;
//if this Set is the last
// return this.refresh();
return this;
},
this.refresh = function() {
//do something
}
};
答案 0 :(得分:0)
在对另一个答案的评论中,你说你想保留相同的签名,但是你可以通过允许一个可选的第三个参数来进行此操作,该第三个参数进一步表达了刷新的意图,而不仅仅是一个简单的布尔值{ {1}}。用户仍然需要指示刷新(并且可能意外地将其称为除最后true
之外的其他位置),但它维护方法链接。
Set
答案 1 :(得分:-2)
也许是这样的:
function Foo(a, b) {
this.a = a;
this.b = b;
this.Set = function(attr, val, isLast) {
this[attr] = val;
if(isLast) {
this.refresh();
}
},
this.refresh = function() {
//do something
}
};
foo.Set({})
foo.Set({})
foo.Set({}, true)