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

  • adrianisen

    adrianisen

    25 Kasım 2009
  • Caramthros

    Caramthros

    10 AĞUSTOS 2007
  • michellefeng's channel

    michellefeng

    26 Kasım 2006