用 Node.js 實現一個 Singleton

2014-09-30 16:25:35 +08:00
 XadillaX
今天隨便玩了一道 CodeWar 的題。

  題意大致就是你需要實現一個 Singleton 也就是單件模式的類,讓其下面代碼執行成功:

var obj1 = new Singleton();
var obj2 = new Singleton();
obj1 === obj2; // => true
obj1.test = 1;
obj2.test; // => 1

  並且還有很重要的一點就是 Singleton 的對象的 instanceof 也得的確是 Singleton 才行。

=== 開始試驗 ===

  我們猜想 new Singleton() 的結果,如果 Singleton 函數也就是這個類的構造函數沒返回值的話,直接會返回 this,有返回值的話,那麼就是等於其返回值了。

  我們碼下面的代碼看一下:

var Singleton = function() {
return { foo: "bar" };
};

console.log(new Singleton());

  跑一遍之後我們的確發現了輸出的值就是:

{ foo: "bar" }

=== 小作弊失敗 ===

  於是我這麼做:

var foo = {};
var Singleton = function() {
return foo;
};

  結果上面的幾個條件都符合了,不信大家可以自己輸出一遍看看。

  但是——

  這東西不是一個 Singleton 的實例,它只是一個簡單的 JSON 對象,所以還是無法通過。

=== 死月の正解 ===

  答案有很多,CodeWar 上面每個人的解法都不一樣,但是歸根結底本質還是大同小異的。

  就是第一次的時候先直接返回 this,並且把 this 放在某個地方。以後每次來這裏創建的時候返回之前存好的 this 即可:

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

// Do some initialize things
// ...

Singleton.prototype.instance = this;
return this;
};

=== 別的寫法 ===

  寫法很多,我這裏隨意挑幾個別人的答案吧。

/**
* By tjwudi
*/
var Singleton = function(){
return Singleton.ins = Singleton.ins ? Singleton.ins : this;
};

/**
* By nonowarn
*/
var Singleton = (function () {
var instance = null;

return function(){
return instance || (instance = this);
};
})();
3176 次点击
所在节点    Node.js
2 条回复
djchurch007
2014-09-30 16:30:12 +08:00
撸猪,泥蜇嚒腻害,偶阔以败你为湿摸?
magicdawn
2014-10-04 13:03:52 +08:00
不是可以改proto吗

```js
function Singleton () {
return singleton_instance;
}
var singleton_instance = { __proto__ : Singleton.prototype };

var obj1 = new Singleton
var obj2 = new Singleton

require('assert')(obj1 === obj2);
require('assert')(obj1 instanceof Singleton);
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/136560

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX