IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    用 Node.js 实现一个 Singleton

    死月·吃圡蕾特发表于 2016-12-27 07:54:03
    love 0

      今天随便玩了一道 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);
    };
    })();


沪ICP备19023445号-2号
友情链接