2011-08-13 12 views
7

Bazı yöntemler içeren bir kütüphane yapıyorum ve extend yöntemini ve load yöntemini kullanıyorum. Ben böyle çalışmak isteriz:JavaScript'te "this" değerini değiştirin

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

Sonra aslında bu yapacağın çalıştırmak için:

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

Core.extend() adına göre benzersiz bir kimliğe sahip bir <div> öğesi oluşturur. Oluşturulan <div>this == yapmak istiyorum.

.call() ve .apply() hakkında biliyorum, ancak this değişmiyor, yalnızca geri arama parametrelerini genişletiyor. 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'); 
    } 
    } 
} 
: Bu ana hattı

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

Not: Burada uzatmak ve yük için kod

cevap

7

Function.call işlevinin ilk argümanı, 0 olarak ayarlamak istediğiniz şey olmalıdır.nesnesi.

demektir

, sen this nesne olarak widgetElement geçmek için

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

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

olarak değişmelidir. Amacıyla

+0

EVET! Yaa! Her zaman ilk paramın "neyin değiştirileceğini" düşündüm. Yani Eğer .call (widgetElement, 'duh') 'yapsaydım, o zaman benim geridönüşümde ilk param' duh 'olurdu. Teşekkürler :) Zaman geçtikten sonra doğru olarak işaretleyeceğim ... –

0

uygun, sen .call() ya ya .apply() ile geri çağırma işlevi yürütmek ve istediğiniz this geçmek this setialabileceğini. fn parametre olarak Core.extend() geçirilen fonksiyon olduğu

Yani, Core.extend() veya Core.load(), iç işleve geçirilen çağırmak üzereyken, sen fn.call(xxx, message) kullanmak istiyorsunuz, xxx sadece yarattığı div elemanı oldu.

Tam olarak yapmaya çalıştığınız şeyi izlemiyorum, ancak this noktasını .call() veya .apply() ile ayarlayın. here ve here'un nasıl çalıştığını görebilirsiniz. Buna

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

: kodunuzda, bu size bunun değişmesi için benziyor .call ilk argümandır beri this işaretçi olmak istediğini

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

ve ikinci argüman ne olduğunu Bu işleve ve işlevinize geçirilmek istediğinizde, yalnızca bir parametre alır, bu yüzden ihtiyacınız olan her şeyi varsayarım.

İlgili konular