V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
XadillaX
V2EX  ›  Node.js

用 Node.js 實現一個 Singleton

  •  
  •   XadillaX · 2014-09-30 16:25:35 +08:00 · 3157 次点击
    这是一个创建于 3710 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天隨便玩了一道 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);
    };
    })();
    2 条回复    2014-10-04 13:03:52 +08:00
    djchurch007
        1
    djchurch007  
       2014-09-30 16:30:12 +08:00
    撸猪,泥蜇嚒腻害,偶阔以败你为湿摸?
    magicdawn
        2
    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);
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5384 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:17 · PVG 16:17 · LAX 00:17 · JFK 03:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.