2012-06-19 14 views
6

Ho un po 'di strano problema, che non riesco a risolvere! Fa parte di un grande framework che sto scrivendo, ma ho scritto un codice di test che ha lo stesso problema. Vedere il seguente:Javascript Type Error, non è una funzione

!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); 

Ora, quando io uso il seguente:

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

ottengo: "popup non è una funzione "TypeError di prova (" # popupLink)". So che è in parte di lavoro, come posso fare utilizzare le funzioni standard di jQuery se faccio qualcosa di simile:

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

Qualsiasi aiuto sarebbe molto apprezzato, come io sto avendo un blocco mentale in questo momento. Grazie in anticipo! :)

Aggiornamento

ho usato console.log per visualizzare l'oggetto restituito, e ha solo l'elemento selettore in, che ha senso come non ho usato prototipo. Come posso ripararlo?

+0

Modificare test.fn in test.prototype o test.fn.prototype – jasssonpet

+0

Ho aggiunto "test.fn.prototype = test.fn", ma non funziona ancora, esattamente lo stesso errore :( – jleck

+0

You deve assegnare un popup al prototipo di test.fn.init. –

risposta

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; 

Ti sei perso il costruttore e la catena di prototipi sulle istanze di test create.

+0

Ah, ora capisco. Grazie mille! – jleck

+0

In realtà un'altra cosa, cosa significa "costruttore: test" fare in questo caso? – jleck

+0

In realtà, non ci siamo riusciti. Se si esegue "new test()", utilizza la funzione di test originale come costruttore .io oh! – jleck