0

看起来这个问题很流行,但没有 jQuery 版本。

我有两节课,第二节课是从第一节课扩展而来的。

扩展方法是从这里复制的

function UIButton(o){
    if (typeof(o) != 'undefined') $.extend(true, this, o); 
    this.setOutput=function(divname){
      alert("first");
    }
}

function UIButton2(o) {
    if (typeof(o) != 'undefined') $.extend(true, this, o);
    this.setOutput=function(divname) {
        alert("second");
    }
    return new UIButton(this);
}

根据jquery文档

第二个对象的方法应该通过使用覆盖第一个对象的方法(同名)$.extend()

但是我在 html 中检查了它,发现第一个对象的功能仍然很好。(Alert "first"...) 这使得它的子类不能重写该函数。

所以我想问一下,这是如何发生的以及如何解决它。我要提醒“秒”……

4

2 回答 2

1

你先扩展,然后设置新的setOutput所以你覆盖了扩展的方法)。

如果您更改顺序,它将起作用..

function UIButton(o){
    this.setOutput=function(divname){
      alert("first");
    }
    if (typeof(o) != 'undefined') $.extend(true, this, o); 
}

function UIButton2(o) {
    this.setOutput=function(divname) {
        alert("second");
    }

    if (typeof(o) != 'undefined') $.extend(true, this, o);
    return new UIButton(this);
}

仅在UIButton此示例中需要,但我将其添加到两者以供将来使用

演示在http://jsfiddle.net/gaby/R26ec/

于 2012-05-12T10:38:40.713 回答
0

您可以使用 jQuery 代理方法来覆盖类 Ref:http ://api.jquery.com/Types/#Context.2C_Call_and_Apply

例如

(function() {
   // log all calls to setArray
   var proxied = jQuery.fn.setArray;
   jQuery.fn.setArray = function() {
   console.log( this, arguments );
   return proxied.apply( this, arguments );
  };
})();
于 2016-04-24T17:52:09.490 回答