2011-08-13 10 views
7

buduję biblioteka z niektórych metod i mam metodę extend oraz sposobu load. Chciałbym go do pracy tak:zmienić funkcje „to” wartość w JavaScript

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

Wtedy rzeczywiście uruchomić to chcesz zrobić:

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

Core.extend() tworzy <div> element z unikatowy identyfikator, na podstawie nazwy. Chcę, aby this == wygenerowany <div>.

Wiem o numerach .call() i .apply(), oczywiście, ale to się nie zmienia this zmienia tylko parametry wywołania zwrotnego w rozszerzeniu. Oto kod dla rozszerzenia i obciążenie:

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()

Uwaga ta jest głównym linia: 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'); 
    } 
    } 
} 

Odpowiedz

7

na Function.call funkcyjnego pierwszy argument powinien być co chcesz ustawić jako 0 Obiekt.

Oznacza to, że należy zmienić

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

do

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

w celu przekazania widgetElement jako przedmiot this.

+0

TAK! Duh! Zawsze myślałem, że pierwszym parametrem było "co zmodyfikować". To znaczy. gdybym zrobił '.call (widgetElement, 'duh')' to w moim callbacku pierwszy param równałby się 'duh'. Dzięki :) P.S. Znów źle, gdy upłynie czas ... –

0

Aby uzyskać this odpowiednio ustawione, należy wykonać funkcję zwrotną albo .call() lub .apply() i przechodzą w this które chcesz.

Więc wewnątrz Core.extend() lub Core.load(), kiedy masz zamiar zadzwonić przekazany w funkcji, należy użyć fn.call(xxx, message) gdzie fn jest funkcja przekazany do Core.extend() jako parametr, xxx był pan właśnie stworzony elementu div.

Nie śledzę dokładnie tego, co chcesz zrobić, ale ustawiasz punkt this na .call() lub .apply(). Można zobaczyć, jak one działają here i here. W kodzie, wygląda na to, należy zmienić w ten sposób:

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

do tego:

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

ponieważ pierwszy argument .call to, co chcesz wskaźnik this być i drugi argument jest co chcesz zostać przekazany do funkcji, a twoja funkcja w twoim przykładzie przyjmuje tylko jeden parametr, więc zakładam, że to wszystko, czego potrzebujesz.

Powiązane problemy