2012-06-19 3 views
6

У меня есть странная проблема, которую я просто не могу решить! Это часть большой структуры, которую я пишу, но я написал некоторый тестовый код, который имеет ту же проблему. Смотрите следующее:Javascript Type Ошибка, не является функцией

!function ($, window, undefined) { 

    // BASE FUNCTION 
    var test = function (selector, context) { 
     return new test.fn.init(selector, context); 
    }; 

    // SELECTOR FUNCTIONS 
    test.fn = { 
     selector: undefined, 
     init:  function (selector, context) { 
      // Use jQuery to build selector object 
      this.selector = $(selector, context); 
      return this; 
     }, 

     // Create a popup dialog 
     popup:  function (options) { 
      this.selector.dialog(); 
     } 
    }, 

    // Expose Carbon to the global object 
    window.test  = test; 

}(window.jQuery, window); 

Теперь, когда я использую следующее:

test('#popupLink').popup(); 

я получаю: "всплывающее окно не является функцией "TypeError тест (" # popupLink)". Я знаю, что это частично работает, как я могу сделать использовать стандартные функции JQuery, если я делаю что-то вроде:

test('#popupLink').selector.hide(); 

Любая помощь будет высоко ценится, так как у меня ментальный блок прямо сейчас. Спасибо заранее! :)

Update

Я использовал console.log для просмотра возвращаемого объекта, и он имеет только элемент селектора, который имеет смысл, поскольку я не использовал прототип. Как я могу это исправить?

+0

Изменить test.fn на test.prototype или test.fn.prototype – jasssonpet

+0

Я добавил «test.fn.prototype = test.fn», но он все еще не работает, точно такая же ошибка :( – jleck

+0

You должен назначить всплывающее окно прототипу test.fn.init. –

ответ

3
(function ($, window) { 
    // BASE FUNCTION 
    var test = function (selector, context) { 
     return new test.fn.init(selector, context); 
    }; 

    // SELECTOR FUNCTIONS 
    test.fn = test.prototype = { 
     constructor: test, 
     init: function (selector, context) { 
      // Use jQuery to build selector object 
      this.selector = $(selector, context); 
      return this; 
     }, 

     // Create a popup dialog 
     popup: function (options) { 
      console.log('popup'); 
      return this; 
     } 
    }; 

    // Expose test to the global object 
    window.test = test; 
}(window.jQuery, window)); 

test.fn.init.prototype = test.fn; 

Вы пропустили конструктор и цепь прототипов на созданных экземплярах теста.

+0

А, я понимаю сейчас. Большое спасибо! – jleck

+0

На самом деле еще одна вещь, что делает «конструктор: тест» в этом случае? – jleck

+0

Собственно, никогда не работал. Если вы выполняете «новый тест()», он использует исходную тестовую функцию в качестве конструктора. D'oh! – jleck

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