2013-11-20 16 views
2

我寫JavaScript的單例類,並希望使用Singleton模式是這樣的:JavaScript的單 - 這是正確的

function TestClass() { 
    var self = TestClass.prototype; 
    if (self.instance) return self.instance; 
    self.instance = this; 

    //methods and props declarations 
} 

var x = new TestClass; 
var y = new TestClass; 

console.log(x === y); // true 

這似乎爲我想像的要工作,但我擔心內存泄漏。所以我決定詢問專家,如果這是正確的解決方案

+1

你想要http://codereview.stackexchange.com/ – Andy

+0

'new'關鍵字創建一個新的實例,所以你不在這裏創建一個單例 – Ibu

+0

This thread http://stackoverflow.com/questions/1895635/javascript -singleton-question有一些很好的解決方案 –

回答

1

不完全。我一般做這樣的事情,當我需要一個單身:

function TestClass() { 
    if (TestClass.__singleton) { 
    return TestClass.__singleton; 
    } 

    // begin construction ... 

    this.a = function() { }; 
    this.b = 1; 

    // ... end construction 

    TestClass.__singleton = this; 

} // TestClass 

var x = new TestClass(); // creates a new TestClass and stores it 
var y = new TestClass(); // finds the existing TestClass 

console.log(x === y); // true 

y.b = 2; 
x.c = 3; 

console.log(x.b === y.b && x.c === y.c); // true 

如果我的理解是正確的,隨後TestClass實例,在這種情況下,創建一個小的,局部定義TestClass對象,但會立即標記他們在垃圾回收時返回TestClass.__singleton

+0

這幾乎是我這樣做的方式。 ) –

+0

@AlexCube我很樂意在這裏看到你的變體作爲答案! – svidgen

+0

我的變化是在主題) 唯一的區別是,我使用的是原型,但結果相同 –

0

你的代碼本身沒有錯,但也不是很好。你沒有創建一個單例,只是「劫持」原型。 #svidgen給出了正確的迴應。

+0

Thanx爲您的答案。但我想知道爲什麼「劫持」原型是不好的?它工作正如我所料,但我仍然擔心由於遞歸鏈接導致的內存泄漏。上面的例子(TestClass .__ singleton)是正確的嗎? –

+0

是的。這是比我更直接的方式。沒有泄漏,JavaScript有GC。 –

+0

被劫持的原型至少是怪異的/罕見的。在處理JavaScript時,你不需要任何不尋常的東西,因爲它只是當涉及到JavaScript中的大型項目時會導致混亂的原則。 –