2011-08-13 6 views
7

Estoy construyendo una biblioteca con algunos métodos y tengo un método extend y un método load. Me gustaría que funciona de esta manera:Cambiar las funciones "this" value en JavaScript

Core.extend('name',function(message){ 
    this.innerHTML = message; 
}); 

Luego de ejecutar realmente esto le haría:

Core.load('name','Hey!'); 

Core.extend() crea un elemento <div> con un identificador único basado en el nombre. Quiero hacer this == el generado <div>.

Sé acerca de .call() y .apply(), obviamente, pero no cambia this solo cambia los parámetros de devolución de llamada en extender. Aquí está el código para extender y carga:

Core.extend()

var extend = function(name,func){ 
    name = name || ''; 
    func = func || function(){}; 
    if(typeof extensions[name] == 'undefined'){ 
    extensions[name] = func; 
    } 
    else{ 
    if(errors){ 
     throw new Error('Core extend() error: the extension "'+name+'" already exists'); 
    } 
    } 
} 

Core.load()

Nota esta es la línea principal: extensions[name].call(this,widgetElement,params);

var load = function(name,params,sel){ 
    name = name || ''; 
    params = params || ''; 
    sel = sel || ''; 
    if(typeof extensions[name] !== 'undefined'){ 
    var widgetElement = document.createElement(settings.widgetWrapperElement); 
    widgetElement.setAttribute('id',settings.prefixOnWidgetId+name); 
    sel.appendChild(widgetElement); 
    extensions[name].call(this,widgetElement,params); 
    } 
    else{ 
    if(errors){ 
     throw new Error('Core load() error: the extension "'+name+'" doesn\'t exist'); 
    } 
    } 
} 

Respuesta

7

El primer argumento de la función Function.call debe ser lo que desea establecer como el this objeto.

Eso significa, debe cambiar

extensions[name].call(this, widgetElement, params); 

a

extensions[name].call(widgetElement, params); 

el fin de pasar widgetElement como el objeto this.

+0

¡SÍ! Duh! Siempre he pensado que el primer param era "qué modificar". Es decir. si hiciera '.call (widgetElement, 'duh')', entonces en mi devolución de llamada el primer param sería igual a 'duh'. Gracias :) P.S. Lo marcaré como correcto una vez que pase el tiempo ... –

0

el fin de obtener this valor apropiado, se ejecuta la función de devolución de llamada, ya sea con o .call().apply() y pase en el this que desea.

Por lo tanto, en el interior de Core.extend() o Core.load(), cuando está a punto de llamar a la aprobada en la función, utilizaría fn.call(xxx, message) donde fn es la función pasa a la Core.extend() como un parámetro, xxx fue el elemento div que acababa de crear.

No sigo exactamente lo que estás tratando de hacer, pero estableces el this punto con .call() o .apply(). Puede ver cómo funcionan here y here. En su código, parece que debe cambiarlo a:

extensions[name].call(this,widgetElement,params); 

a esto:

extensions[name].call(widgetElement, params); 

desde el primer argumento de .call es lo que quiere el puntero this sea y el segundo argumento es lo usted quiere pasar a la función y su función en su ejemplo solo toma un parámetro, así que supongo que eso es todo lo que necesita.

Cuestiones relacionadas