Jquery插件的私有和公共属性

Jquery插件的私有和公共属性,jquery,jquery-plugins,Jquery,Jquery Plugins,我正在尝试编写我的第一个简单jquery插件,但我不知道如何在jquery对象内创建私有变量。这是代码 var first; var second; $(document).ready(function(){ first = $("#clicker1").demSelector(); second = $("#clicker2").demSelector(); }); $(".totalClicks").click(function(){ alert("Clicks 1 =

我正在尝试编写我的第一个简单jquery插件,但我不知道如何在jquery对象内创建私有变量。这是代码

var first;
var second;
$(document).ready(function(){
  first = $("#clicker1").demSelector();
  second = $("#clicker2").demSelector();
});

 $(".totalClicks").click(function(){
    alert("Clicks 1 = "+first.number());
    alert("Clicks 2 = "+second.number());
});


(function($){
  var num = 0;
  $.fn.demSelector = function() {
    return this.each(function(){
      init(this);
    });
  };

  $.fn.number = function(){
    return num;
  };

  function init(control){
      $(control).on('click','.num-of-clicks', function(){
        num = parseInt($(this).html(),0) + 1;
        $(this).html(num);
      });
  }
})(jQuery);
和演示项目

单击“0”时,它会增加并更改变量num。但它会更改第一个和第二个对象的num。所以,在第一行上单击两次并单击按钮“Show”后,我会收到两条消息“clicks 1=2”和“clicks 2=2”,但应该是“clicks 1=2”和“clicks 2=0”。看起来变量num是全局的


我做错了什么?

您应该做什么?它使用将数据存储在相关的DOM元素上。大概是这样的:

var first;
var second;
$(document).ready(function(){
  first = $("#clicker1").data('count',0);
  second = $("#clicker2").data('count',0);    
});

$(document).on('click','.clicker', function(){
    $(this).data('count',$(this).data('count')+1);
    $(this).find('.num-of-clicks').html($(this).data('count'));
});

JavaScript不明确支持公共和私有变量。但是,您可以使用来模拟它们。我知道javascript不支持公共或私有修饰符,但如何使变量“num”对每个对象都是唯一的?这是因为您在事件处理程序中使用回调函数——它正在修改名为
num
的全局变量,并且无法访问您的“private”变量
num
。如何使其工作?我真的是stuckSo num=parseInt($(this.html(),0)+1;更改方法init()的“局部”变量num,但不更改另一个num?但还有其他方法吗?编写此代码的原因是为了学习jquery插件和处理插件中的事件。您“私下”将
count
数据存储在单击的元素中。无论有没有插件,这都是实现您想要的目标的最佳方式。我所知道的唯一的另一种方法是使用全局变量,这在插件中是绝对要避免的。