2015-03-02 5 views
0

В следующем коде, .refresh можно назвать .add, но я получаю Uncaught TypeError: undefined is not a function Я думаю, потому что она не определена в момент создания класса, но если это правда, без повторения кода, есть способ вызова sibling public function из того же класса?Как я могу назвать функции sibling в одноэлементном классе?

var fileSelector = (function() { 
    var self = this; 
    function callback (data,status,xhr) { 
     $("#File_Selector_Container").html(data); 
     utils.setItem ("fileSelector", "TRUE"); 
    } 
    return { 
     refresh : function() { 
      if (utils.getItem ("fileSelector") == "TRUE") { 
       self.add(); 
      } 
     }, 
     add : function() { 
      $.get(script_name ,"AddFileSelector",callback,"html"); 
     }, 
     remove : function() { 
      $("#File_Selector_Container").html(""); 
     } 
    } 
})(); 

Я начал это с: Simplest/Cleanest way to implement singleton in JavaScript? и я не могу найти его сейчас, но другой вопрос, где я получил self=this от.

+1

Try 'this.add()' ' – Barmar

+1

this' (и, следовательно,' self') просто относится к глобальный объект (т.е. «окно»). Вот почему вы получаете ошибку, нет глобальной функции 'add'. Я рекомендую прочитать [документацию MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this), чтобы узнать, как это работает. –

+0

this.add() сделал работу, однако, глядя на 2-е предложение ....... – Quade2002

ответ

1

this (и, следовательно, self) просто относится к глобальному объекту (то есть window). Вот почему вы получаете ошибку, нет глобальной функции add. Я рекомендую прочитать MDN documentation, чтобы узнать, как работает this.

Одно решение сохранить ссылку на объект вы возвращающегося и использовать вместо:

var fileSelector = (function() { 
    function callback (data,status,xhr) { 
     $("#File_Selector_Container").html(data); 
     utils.setItem ("fileSelector", "TRUE"); 
    } 
    var fileSelector = { 
     refresh : function() { 
      if (utils.getItem ("fileSelector") == "TRUE") { 
       fileSelector.add(); 
      } 
     }, 
     add : function() { 
      $.get(script_name ,"AddFileSelector",callback,"html"); 
     }, 
     remove : function() { 
      $("#File_Selector_Container").html(""); 
     } 
    }; 

    return fileSelector; 
})(); 
+0

Работал как шарм, и мне это нравится намного лучше, гораздо проще следить за тем, что есть, спасибо! – Quade2002

Смежные вопросы