SORU
22 EKİM 2009, PERŞEMBE


Kullanım .() uygulamak '' operatör. Bu mümkün mü?

JavaScript, bir nesne örneği (new operatör üzerinden) oluşturmak istiyorum, ama kurucu argümanların rastgele bir sayı iletin. Bu mümkün mü?

Yapmak istediğim şey bu ama aşağıdaki kod çalışmıyor) gibi bir şey:

function Something(){
    // init stuff
}
function createSomething(){
    return new Something.apply(null, arguments);
}
var s = createSomething(a,b,c); // 's' is an instance of Something

Cevap

Cevaplar burada, yerleşik hayır new operatör .apply() aramak için ortaya çıktı. Ancak, insanlar bu sorun için gerçekten ilginç çözümler önerdi.

Benim tercih çözüm this one from Matthew Crumley (arguments özelliği geçmek için modifiye ettim):

var createSomething = (function() {
    function F(args) {
        return Something.apply(this, args);
    }
    F.prototype = Something.prototype;

    return function() {
        return new F(arguments);
    }
})();

CEVAP
22 EKİM 2009, PERŞEMBE


Burada herhangi bir yapıcı (farklı fonksiyonlar olarak aradığında, String, 12*, Date*, vb gibi davranan yerli markalar hariç) çağırabileceğiniz genelleştirilmiş bir çözüm. bağımsız değişkenler: bir dizi ile

function construct(constructor, args) {
    function F() {
        return constructor.apply(this, args);
    }
    F.prototype = constructor.prototype;
    return new F();
}

Bir nesne construct(Class, [1, 2, 3]) arama tarafından oluşturulan bir nesne new Class(1, 2, 3) ile oluşturulan aynı olacaktır.

Ayrıca kurucu her zaman geçirmene gerek yok yani daha özel bir sürüm yapabilirsiniz. Bu iç işlevi yeni bir örneğini aramak her zaman yaratmaya gerek yok, çünkü aynı zamanda biraz daha etkilidir.

var createSomething = (function() {
    function F(args) {
        return Something.apply(this, args);
    }
    F.prototype = Something.prototype;

    return function(args) {
        return new F(args);
    }
})();

Ve dış anonim fonksiyon oluşturma ve çağırma nedenini genel ad kirletici F fonksiyon tutmaktır. Bazen modül desen deniyor.

[GÜNCELLEME]

TS F eğer bir hata veriyor bu yana TypeScript bu kullanmak isteyenler için bir şey verir:

function construct(constructor, args) {
    function F() : void {
        constructor.apply(this, args);
    }
    F.prototype = constructor.prototype;
    return new F();
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Day9TV

    Day9TV

    22 NİSAN 2010
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011
  • Virtual Riot

    Virtual Riot

    19 Mayıs 2011