我是javascript的新手,我正在试图弄清楚如何做这样的事情
SomeClass = {
confirm: function(){
if(!confirm('Sure?'))
{
return false;
}
},
someMethod: function(){
alert("OK");
}
}
这就是我真正想做的事情
SomeClass.confirm().someMethod();
实际上我需要通过在实际方法前添加.confirm()来确认操作。这甚至可能吗?
答案 0 :(得分:4)
SomeClass = {
confirm: function(){
if(!confirm('Sure?'))
{
this.status=false;
return this;
}
},
someMethod: function(){
if(this.status){
alert("OK");
}
}
}
这种方法链接只有在您返回对象本身时才有可能。您可以使用状态来指示用户是否已确认。
你也可以只返回一个具有相应somemethod
的对象,虽然我怀疑你希望方法链接比这更通用:
SomeClass = {
confirm: function(){
if(!confirm('Sure?'))
{
return {someMethod:function(){alert("Canceled");}};
}
return {someMethod:function(){alert("OK");}};
}
}
理想情况下,您可以通过构造函数创建对象,并且confirm方法将返回SomeClass
status
标志设置为true的新实例或假的。
答案 1 :(得分:3)
要执行fluent interface,您需要从每个函数调用返回对象本身。这意味着重构你的if逻辑:
SomeClass = {
wasConfirmed: false,
confirm: function(){
this.wasConfirmed = confirm('Sure?');
return this;
},
someMethod: function(){
if(this.wasConfirmed) alert("OK");
}
}
答案 2 :(得分:0)
尝试
var SomeClass = {
state: null,
confirm: function(){
this.state = confirm('Sure?');
return this;
},
someMethod: function() {
alert(this.state ? 'OK' : 'Error');
}
};
SomeClass.confirm().someMethod();
答案 3 :(得分:0)
您将无法以您描述的方式链接方法调用:
SomeClass.confirm().someMethod();
如果您的confirm方法返回除定义SomeClass
的{{1}}对象以外的任何内容。
您可能在jQuery中看到过类似的内容:
someMethod()
它的工作原理是因为// trigger click handlers of the element with id="id" and hide it:
$("#id").click().hide();
方法返回了它本身被调用的同一个对象,因此可以在那个返回的对象上调用click()
方法。返回除jQuery对象以外的任何东西的方法即使在jQuery中也无法链接(仅作为链中的最后一个方法)。
答案 4 :(得分:0)
如果我理解正确,您希望任何操作都是“可确认的”,那么您可以编写一个类,其中显示用户显示的消息,以及如果“已确认”则执行的操作
var Confirmer = {
confirm: function(msg, action){
if(confirm(msg)){
action();
}
}
}
然后你可以这样称呼它:
Confirmer.confirm("Are you sure?", function(){ alert("hello"); });
使用第二个参数在用户确认后调用任何函数。