2012-06-19 12 views
6

¡Tengo un problema extraño que parece que no puedo resolver! Es parte de un gran marco que estoy escribiendo, pero he escrito un código de prueba que tiene el mismo problema. Véase el siguiente:Error de tipo Javascript, no es una función

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

Ahora cuando utilizo el siguiente:

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

me sale: "emergente no es una función "TypeError de prueba (" # popupLink)". Sé que es parte de trabajo, como lo podemos hacer uso de las funciones estándar de jQuery si hago algo como:

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

Cualquier ayuda sería muy apreciada, ya que estoy teniendo un bloqueo mental en este momento. ¡Gracias de antemano! :)

actualización

he utilizado console.log para ver el objeto devuelto, y que sólo tiene el elemento de selección, lo cual tiene sentido ya que no hizo uso de prototipo. ¿Cómo puedo arreglar eso?

+0

Cambiar test.fn a test.prototype o test.fn.prototype – jasssonpet

+0

He añadido "test.fn.prototype = test.fn", pero sigue sin funcionar, exactamente el mismo error :( – jleck

+0

Usted debe asignar ventana emergente al prototipo de test.fn.init. –

Respuesta

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; 

Olvidó el constructor y la cadena de prototipos en las instancias de prueba creadas.

+0

Ah, ya lo entiendo. Muchas gracias! – jleck

+0

En realidad, una cosa más, ¿qué hace "constructor: test" en este caso? – jleck

+0

En realidad, nunca lo resolvió. Si hace "new test()", usa la función de prueba original como el constructor. ¡Oh oh! – jleck