2011-05-07 32 views

cevap

1

Hmm. Hayır, öyle düşünmüyorum. this ayarlanamaz. Bunu değiştiremezsiniz, ancak buna özellik ekleyebilirsiniz. make calls that cause this to be set yapabilirsiniz, ancak doğrudan ayarlayamazsınız.

Böyle bir şey yapabilirsiniz:

function AjaxRequest (parameters) { 
    this.xhr = null; 
    if (window.XMLHttpRequest) { 
     this.xhr = new XMLHttpRequest(); 
    } 
    else if (typeof ActiveXOBject != 'undefined') { 
     this.xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
} 

AjaxRequest.prototype.someMethod = function (url) { 
    this.xhr.open('Get', url, true); 
    this.req.onreadystatechange = function(event) { 
     ... 
    }; 
    this.xhr.send(...); 
}; 

geri Stepping, senin tasarım çok net olmadığını düşünüyorum. Ne yapmaya çalışıyorsun? Bunu sormanın başka bir yolu için çekim modeliniz nedir? Hangi fiiller AjaxRequest'dan açığa çıkmak istiyorsunuz? Hangi yöntemler?

jQuery'ye bakarsanız, "ajax isteği" bir nesne değildir, bir yöntemdir. $ajax()....

Sizin nedir?

Bu, xhr özelliğini nasıl kullandığınızı belirler.

+0

Çok teşekkürler! Ajaxrequest'i bir nesneyi yapıp yapamayacağımı görmek için bunu deniyordum. Javascript için yeniyim ve her isteği bir nesne olarak ele almanın mantıklı olacağını düşündüm. Ama açıkça işlevlerle gitmeliyim. Çok teşekkürler! – Mansiemans

+0

Aslında, JavaScript'in değerini 'apply() 've' call() 'kullanarak bu değerin ayarlanması için en azından bazı sınırlı özellikler var. Bakınız: http://odetocode.com/blogs/scott/archive/2007/07/05/function-apply-and-function-call-in-javascript.aspx – aroth

+0

@aroth, Bu cevapta belirtilmiştir. – Cheeso

6

Yapıcıdan farklı türde bir nesne döndürmek mümkündür, ancak yapmaya çalıştığınız şeyden tam olarak değil. Bir nesneyi döndürdüğünüzde, undefined yerine (bu, varsayılan dönüş değeridir), new ifadesinin sonucu olarak "değiştirilir". Nesne prototipini yapıcıdan almaz (ve x instanceof AjaxRequest çalışmaz). O bunu yapmak istiyorum nasıl olursa

Bu yakın alacak:

function AjaxRequest (parameters) { 
    var result; 

    if (window.XMLHttpRequest) 
     result = new XMLHttpRequest(); 
    else if (typeof ActiveXOBject != 'undefined') 
     result = new ActiveXObject("Microsoft.XMLHTTP"); 

    // result is not an AjaxRequest object, so you'll have to add properties here 
    result.someMethod = function() { ... }; 

    // Use result as the "new" object instead of this 
    return result; 
} 
+0

Hangi çözümü düşünürdünüz? 'temizleyici', sizinki veya Cheeso'nun önerdiği yöntem, 'nesneden farklı' AjaxRequest nesnesinin bir alanı olarak saklanır? – Mansiemans

+1

Gerçekten de, her iki yoldan da "constructor" dan farklı bir tür döndürmekle birlikte 'AjaxRequest.prototype' yöntemlerini ekleyebilmeniz ve 'instanceof' yöntemini kullanabilmeniz beklenebileceğinden, kafa karıştırıcı olabilir. Cheeso'nun çözümünün olumsuz tarafı, gerçek XHR nesnesine tüm işlev çağrılarını iletmek için sarmalayıcılar yazmak zorunda olmanızdır. veya doğrudan erişim ('myObject.xhr.send()' gibi) –

+1

Cheeso'nun çözümüne bir başka (olası) fayda, jQuery, Prototype, Dojo vb. gibi kendi basit arayüzünüzü tanımlamanızdır. –

İlgili konular