Как сделать копии (новые экземпляры) функции замыкания?

0

У меня есть объект/функция/закрытие (я думаю, что все три?), И мне нужно применить отдельные экземпляры его к нескольким элементам на странице.

var NS = NS || {};
NS.PLAJAX = function(){

   var pub = {};
   var self = this;


   pub.Init = function(FormRef){      
     // do stuff
   };   

   self.aPrivateFunction = function(){      
      // do stuff
   }

   return pub;
}();


// Apply a *copy* to each element with the given class
$(function(){
   $('.el-form-wrapper').each(function(index, Element){
      // Attempt #1
       NS.PLAJAX.Init(Element); // Doesn't make copies! 

      //OR, Attempt #2      
      var Newbie = new NS.PLAJAX(); // Throws a "not a constructor" error
      Newbie.Init(Element);
   });
});

Как я могу получить новый экземпляр этого замыкания/объекта для каждого элемента?

Теги:

2 ответа

2

У вас есть только объект. Однако для использования new ключевого слова вам нужна функция (конструктор).

Нет необходимости возвращать что-либо из конструктора. new ключевое слово создает новый объект, вызывает функцию с этим новым объектом, как this, а затем возвращает его. Публичным методам должны быть присвоены свойства this (self), а частные методы должны быть локальными переменными. То, что у вас получится, это примерно так:

var NS = NS || {};
NS.PLAJAX = function(){
   var self = this;


   self.Init = function(FormRef){      
     // do stuff
   };   

   var aPrivateFunction = function(){      
      // do stuff
   }
};


// Apply a *copy* to each element with the given class
$(function(){
   $('.el-form-wrapper').each(function(index, Element){   
      var Newbie = new NS.PLAJAX();
      Newbie.Init(Element);
   });
});
  • 0
    Но если вы сделаете это таким образом, PLAJAX больше не будет закрытием.
  • 0
    @Nick: по-прежнему создается замыкание, которое включает функцию aPrivateFunction в каждом экземпляре PLAJAX. Почему вы думаете, что это не закрытие? Как вы думаете, закрытие?
Показать ещё 2 комментария
0

я пробовал это, и это работает для меня, надеюсь, это будет работать для u

var NS = NS || {};

NS.PLAJAX = function(){

   var pub = {};
   var self = this;


   pub.Init = function(FormRef){      
     alert(FormRef);
   };   

   self.aPrivateFunction = function(){      
      alert("private");
   }

   return pub;
};

//доступ к объекту NS

   $(function(){
  $('.el-form-wrapper').each(function(index, Element){
       var a=NS.PLAJAX();
       console.log(typeof(a));
       a.Init("gg"); // Doesn't make copies! 

          //OR, Attempt #2      
          var Newbie = new NS.PLAJAX(); // Throws a "not a constructor" error
          Newbie.Init("ff");
});
      });

см. демо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню