SORU
15 Aralık 2008, PAZARTESİ


Nasıl bir işlev olarak kurucusu olarak da bilinir olup olmadığını tespit etmek için?

Bir fonksiyon verilir

function x(arg) { return 30; }

Bunu iki şekilde arayabilirsiniz:

result = x(4);
result = new x(4);

İlk döner 30, ikinci bir nesne döndürür.

Nasıl fonksiyonu olan tespit edebilirsiniziçeride kendisi işlevi?

Çözüm ne olursa olsun, şu dua ile de çalışması gerekir:

var Z = new x(); 
Z.lolol = x; 
Z.lolol();

Tüm çözümler Z.lolol() yapıcı olarak çağırıyor, şu anda düşünüyorum.

CEVAP
10 Aralık 2009, PERŞEMBE


İstediğin şey mümkün olduğunu sanmıyorum. Yeterli bilgi işlevi içinde güvenilir bir çıkarım yapmak mümkün değil.

ECMA 3rd edition spec bakarak, adımları new x() çağrıldığında alınan özleri

  • Yeni bir nesne oluşturur
  • Kendi iç atama [[Prototype]] x . prototip özelliği
  • Normal olarak x this yeni nesne geçirmeden arayın
  • Eğer 12 ** çağrısı bir nesne, geri döndü, aksi takdirde yeni bir nesne döndürür

Yararlı bir şey hakkında nasıl işlevi çağrıldı verildiği için yürütülen kod, bu yüzden tek şey mümkün için test içinde x this değeri, nedir tüm cevaplar burada yapıyor. Olduğun gibi gözlenen, yeni bir örnek* x arama x gibi bir kurucu olduğunu ayırt edilemez bir önceden varolan örnek x geçtikçe this arama x gibi bir fonksiyonsüreceinşa edilmiş olduğu gibi, her yeni nesne x yarattığı bir özellik atayın:

function x(y) {
    var isConstructor = false;
    if (this instanceof x // <- You could use arguments.callee instead of x here,
                          // except in in EcmaScript 5 strict mode.
            && !this.__previouslyConstructedByX) {
        isConstructor = true;
        this.__previouslyConstructedByX = true;
    }
    alert(isConstructor);
}

Belli ki bu şimdi üzerine her nesne x tarafından inşa ekstra işe yaramaz bir özelliği vardır beri ideal değildir, ama yapabileceğin en iyi şey bu bence.

(*)"örnek" yanlış bir terim ama yeterince yakın, ve daha özlü "bir kurucu olarak x arama tarafından yaratılmış olan nesne"

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • Mary Jane Tauyan

    Mary Jane Ta

    20 AĞUSTOS 2009
  • Michael Lummio

    Michael Lumm

    25 Mayıs 2007