SORU
25 EYLÜL 2008, PERŞEMBE


Nasıl "bu" JavaScript bir nesne içinde anahtar kelime iş değişmez mi?

Ben sadece Javascript ile ilginç bir durumla karşılaştık. Çeşitli nesneler nesne-edebi gösterim kullanarak tanımlayan bir yöntem ile bir sınıf var. Bu nesneler içinde, this işaretçiyi kullanılıyor. Programın davranış, this işaretçiyi hangi yöntemi başlatıldığı sınıf ve nesne değişmezini tarafından oluşturulan bahsediyor olması anlayabildim. Bu iş için beklediğiniz şekilde olmasına rağmen gelişi. Bu davranış tanımlanır? -Çapraz tarayıcı güvenli mi? Herhangi bir mantık ötesinde bir durum bu yüzden alttaki "spec öyle diyor" (örneğin, felsefe/biraz daha geniş bir tasarım kararı sonucu) var mı? -Aşağı karşılaştırıldı kod örneği:

// inside class definition, itself an object literal, we have this function:
onRender: function() {

	this.menuItems = this.menuItems.concat([
		{
			text: 'Group by Module',
			rptletdiv: this
		},
		{
			text: 'Group by Status',
			rptletdiv: this
		}]);
	// etc
}

Teşekkürler!

CEVAP
25 EYLÜL 2008, PERŞEMBE


Benim başka bir görevinden alınacak ve orada, burada hiç bilmek istedim daha fazlabu.

Başlamadan önce, burada akılda konusunda Javascript ve mantıklı değil ne zaman kendi kendinize tekrarlamak için tutulması gereken en önemli şey. Javascript sınıfları yok. Eğer bir şey bir sınıf gibi görünüyor, zekice bir numara. Javascript vardırnesnelervefonksiyonlar. (bu 0 doğru değil, işlevleri sadece nesneler vardır, ama bazen ayrı şeyler olarak düşün) için yararlı olabilir

budeğişken fonksiyonları bağlı. Bir fonksiyonu çağırmak her zaman, her zamanbubelirli bir değer, işlev çağırmak. nasıl bağlı olarak verilir Bu sık sık çağırma desen denir.

Javascript işlevleri çağırmak için dört yolu vardır. Bir işlevi çağırabilirsinizyöntembir olarakişlevibir olarakkurucuve ileuygulayın.

Bir Yöntem olarak

Bir metod bir nesneye bağlı olan bir işlevdir

var foo = {};
foo.someMethod = function(){
    alert(this);
}

Bir yöntem çağrıldığında,bunesneye bağlı fonksiyon/yöntemi bir parçasıdır. Bu örnekte, bu foo bağlı olacak.

Bir Fonksiyonu Olarak

Eğer başına bir işlevi var,budeğişken "" nesne, neredeyse her zaman . küresel bağlanacak ^em>pencerebir tarayıcı bağlamında nesne.

 var foo = function(){
    alert(this);
 }
 foo();

Bu takıldın ne olabilirama kendini kötü hissetme. Birçok kişi bu kötü bir tasarım kararı göz önünde bulundurun. Bir geri arama yöntemi olarak, bir fonksiyon olarak değil, çağrılan beri, bu tutarsız bir davranış gibi görünen görüyorsunuz.

Birçok kişi bir şey olabilir, bunu yaparak bu sorunu geçici olarak almak

var foo = {};
foo.someMethod = function (){
    var that=this;
    function bar(){
        alert(that);
    }
}

Bir değişken tanımlayınbuişaret ederbu. Kapatılması (kendi hepsi bir konu) tutarbueğer bir geri arama bar ararsan o, hala bir başvuru var.

Bir Kurucu olarak

Ayrıca bir kurucu gibi bir işlevi çağırabilirsiniz. Adlandırma dayalı kullanıyorsun (Örneği) bu dayaptığın şey olabilir ve takıldın.

Yeni anahtar kelime ile Yapıcı bir işlev olarak çağırır.

function Foo(){
    this.confusing = 'hell yeah';
}
var myObject = new Foo();

Bir kurucu olarak çağrılan, yeni bir Nesne oluşturulurbubu nesneye bağlı olacak. İç fonksiyonları ve geri olarak kullanıyorlar yine, onları çağırma olacak fonksiyonları gibibuküresel bir nesneye bağlı olacak. = Bu hile/desen var kullanın.

Bazı insanlar yapıcı/yeni bir anahtar kelime kemik birşey sınıflar için benzer oluşturmak için bir yol olarak geleneksel OOP programcılar Java/oluşturuldu düşünüyorum.

Bu Yöntemi Uygulamak.

Son olarak, her işlevi bir yöntem (Evet, fonksiyonları Javascript nesneleri) adlı "" uygulayın. Senin değerini belirlemek sağlar uygulayınbuolacak ve aynı zamanda bağımsız bir dizi geçmek sağlar. İşte işe yaramaz bir örnek.

function foo(a,b){
    alert(a);
    alert(b);
    alert(this);
}
var args = ['ah','be'];
foo.apply('omg',args);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Juan Carlos Candela Bordera

    Juan Carlos

    4 Mart 2009
  • Attempts at least

    Attempts at

    1 Ocak 2007
  • Miles Fisher

    Miles Fisher

    8 NİSAN 2009