2010-10-10 21 views
6

Şu anda javascript oluşturmak için iki yol biliyorum. Birincisi:Dönüşü kullanmadan bir kurucu ile bir JavaScript singleton nasıl oluşturulur?

var singleton = { 
publicVariable: "I'm public", 
publicMethod: function() {} 
}; 

O ben başlatma kodu çalıştırabilir bir kurucu yok haricinde mükemmel.

İkincisi:

(function() { 

var privateVariable = "I'm private"; 
var privateFunction = function() {} 

return { 
publicVariable: "I'm public", 
publicMethod: function() {} 
} 

})(); 

ilk sürümü özel özelliklere sahip değildir ne de bir kurucu var, ancak daha hızlı ve basittir. İkinci versiyon daha karmaşık, çirkin, ama bir kurucu ve özel özelliklere sahip. Ben özel özellikleri için bir ihtiyaç değilim

, sadece yapıcı olmasını istiyorum. Kaybettiğim bir şey var mı yoksa sahip olduğum tek şeylerin üstünde iki yaklaşım var mı?

+1

İkinci yaklaşım "çirkin" değil; dilin doğal bir parçası. Fonksiyonlu fonksiyonlar oluşturabilmek, Javascript'in en güçlü özelliklerinden biridir. – Pointy

cevap

7
function Singleton() { 
    if (Singleton.instance) 
    return Singleton.instance; 
    Singleton.instance = this; 
    this.prop1 = 5; 
    this.method = function() {}; 
}​ 
+0

Bence bu çözüm net değil, çünkü bu kurucunun kullanımı bir sonraki: 'Singleton() '. Bu, bir geliştiricinin, bu kodu her yazışında yeni bir örnek almayı beklediği anlamına gelir. Yani 'new Singleton() == new Singleton()' 'true' döndürür, ancak' false'ı döndürmelidir. – pto3

1
var singleton = new function() { // <<----Notice the new here 
    //constructorcode.... 

    this.publicproperty ="blabla"; 
} 

Bu temelde sonra anında değişken tekiz için bunun yeni bir instace assiging, bir işlevi oluşturmakla aynıdır. Var singleton = new SingletonObject() gibi; tekiz rağmen nedeniyle yürütme düzenin javscript bu şekilde kullanılmasına karşı

ederim tavsiye dosyasında kendi mantık nesne değil, koyun nerede dayanmaktadır.

1

Buna ne dersiniz? İşte

var Singleton = (function() { 
    var instance; 

    // this is actual constructor with params 
    return function(cfg) { 
     if (typeof instance == 'undefined') { 
      instance = this; 
      this.cfg = cfg; 
     } 
     return instance; 
    }; 
})(); 

var a = new Singleton('a'); 
var b = new Singleton('b'); 

//a === b; <-- true 
//a.cfg <-- 'a' 
//b.cfg <-- 'a' 
2

kapanışları ile benim çözümdür:

function Singleton() { 

    Singleton.getInstance = (function(_this) { 
     return function() { return _this; }; 
    })(this); 
} 

Testi:

var foo = new Singleton(); 
var bar = Singleton.getInstance(); 
foo === bar; // true 
2

sen ne kadar bu konuda, sizin singleton'ununu başlatmak için bir yer arıyorsanız?

var singleton = { 
    'pubvar': null, 
    'init': function() { 
     this.pubvar = 'I am public!'; 
     return this; 
    } 
}.init(); 

console.assert(singleton.pubvar === 'I am public!'); 

Basit ve zarif.

İlgili konular