3

我是 javascript 新手,我正在尝试弄清楚如何做这样的事情

SomeClass = {

    confirm: function(){
        if(!confirm('Sure?'))
        {
            return false;
        }
    },

    someMethod: function(){
        alert("OK");
    }

}

这就是我真正想做的

SomeClass.confirm().someMethod();

事实上,我需要通过在实际方法前面添加 .confirm() 来确认操作。这甚至可能吗?

4

5 回答 5

5
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 方法将返回标志设置为 true 或 false的实例。SomeClassstatus

于 2012-10-29T13:28:16.473 回答
3

要做一个流畅的接口,你需要从每个函数调用中返回对象本身。这意味着重构你的 if 逻辑:

SomeClass = {

wasConfirmed: false,

confirm: function(){
    this.wasConfirmed = confirm('Sure?');

    return this;
},

someMethod: function(){
    if(this.wasConfirmed) alert("OK");
}

}
于 2012-10-29T13:29:17.300 回答
0

尝试

var SomeClass = {
  state: null,

  confirm: function(){
    this.state = confirm('Sure?');    

    return this;
  },

  someMethod: function() {
    alert(this.state ? 'OK' : 'Error');
  }
};

SomeClass.confirm().someMethod();
于 2012-10-29T13:27:22.637 回答
0

您将无法以您描述的方式链接方法调用:

SomeClass.confirm().someMethod();

如果您的确认方法返回的SomeClass对象不是已someMethod()定义的对象。

你可能已经在 jQuery 中看到过这样的事情:

// trigger click handlers of the element with id="id" and hide it:
$("#id").click().hide();

它之所以有效,是因为该click()方法返回调用它本身的同一对象,因此可以在hide()返回的对象上调用该方法。即使在 jQuery 中也不能链接返回任何非 jQuery 对象的方法(仅作为链中的最后一个方法)。

于 2012-10-29T13:29:42.200 回答
0

如果我对您的理解正确,您希望任何操作都是“可确认的”,那么您可以编写一个类,该类将消息显示给用户,以及在“确认”时执行的操作

var Confirmer = {

  confirm: function(msg, action){
       if(confirm(msg)){
          action();
       }
  }

}

然后你会这样称呼它:

Confirmer.confirm("Are you sure?", function(){ alert("hello"); });

使用第二个参数,您希望在用户确认后调用的任何函数。

于 2012-10-29T13:32:39.310 回答