被覆盖的另一个jQuery插件实例的属性

时间:2012-04-29 01:04:40

标签: jquery plugins attributes override instance

我遇到了这个奇怪的问题,我的jQuery插件的其他实例正在被修改,即使我相信我已经编写了我的插件以支持多个单独的实例。

我已将代码简化为基本要素,您可以在此处进行测试:http://jsbin.com/ajifoh/4/edit#html,live

第一次按下任一文本框中的某个键时,它应该在控制台中显示leng: 0,但是在由于某种原因触发了第一个键之后,第二个也有为所有插入的所有comboPart首先......我做错了什么?

;(function($, window, document, undefined){

  var KeyCombinator = function( elem, options ){
      this.$elem = $(elem);
    };

  function ComboPart(keyCode){
    if (keyCode !== undefined){
      this.keyCode = keyCode;
    }
  }
  function ComboData(){
    this.comboParts= [];
  }

  function set_insert(array, value){
    array.push(value);
  }

  KeyCombinator.prototype = {
    comboData: new ComboData(),

    eval_key_event: function(e){
      set_insert(this.comboData.comboParts, new ComboPart(e.keyCode));
    },

    init: function(){
      var $elem = this.$elem;
      var that = this;

      $elem.keydown(function(e){
        console.log('leng', that.comboData.comboParts.length);
        that.eval_key_event(e);
      });
    }
  };

  $.fn.makeKeyCombinator = function(options) {
    return this.each(function() {
      new KeyCombinator(this, options).init();
    });
  };

})(jQuery, window, document);

1 个答案:

答案 0 :(得分:1)

添加到prototype的属性每种类型只存在一次。由于您在ComboData上实例化了KeyCombinator.prototype,因此KeyCombinator的所有实例都共享ComboData的单个实例。如果您希望ComboData的每个实例都有KeyCombinator的唯一实例,则需要在KeyCombinator构造函数中实例化它:

var KeyCombinator = function( elem, options ){
    this.$elem = $(elem);
    this.comboData = new ComboData();
};

以下是jsbin中的一个工作示例。