Javascript:最佳单例模式

标签 javascript singleton design-patterns

<分区>

Possible Duplicate:
Simplest/Cleanest way to implement singleton in JavaScript?

我将此模式用于单例,在示例中单例是 PlanetEarth:

var NAMESPACE = function () {

    var privateFunction1 = function () {
        privateFunction2();
    };

    var privateFunction2 = function () {
        alert('I\'m private!');
    };

    var Constructors = {};

    Constructors.PlanetEarth = function () {
        privateFunction1();
        privateFunction2();
    };

    Constructors.PlanetEarth.prototype = {
        someMethod: function () {
            if (console && console.log) {
                console.log('some method');             
            }
        }
    };

    Constructors.Person = function (name, address) {
        this.name = name;
        this.address = address;
    };

    Constructors.Person.prototype = {
        walk: function () {
            alert('STOMP!');
        }
    };

    return {
        Person: Constructors.Person, // there can be many
        PlanetEarth: new Constructors.PlanetEarth() // there can only be one!
    };

}();

由于 PlanetEarth 的构造函数仍然是私有(private)的,因此只能有一个。

现在,有件事告诉我,这种自制的东西并不是最好的,主要是因为我没有接受过学术教育,而且我倾向于以愚蠢的方式解决问题。您会建议什么作为我的方法的更好替代方案,其中更好被定义为在风格上更好和/或更强大

最佳答案

(1) 2019 年更新:ES7 版本

class Singleton {
    static instance;

    constructor() {
        if (instance) {
            return instance;
        }

        this.instance = this;
    }

    foo() {
        // ...
    }
}

console.log(new Singleton() === new Singleton());

(2) ES6版本

class Singleton {
    constructor() {
        const instance = this.constructor.instance;
        if (instance) {
            return instance;
        }

        this.constructor.instance = this;
    }

    foo() {
        // ...
    }
}

console.log(new Singleton() === new Singleton());

找到的最佳解决方案: http://code.google.com/p/jslibs/wiki/JavascriptTips#Singleton_pattern

function MySingletonClass () {

  if (arguments.callee._singletonInstance) {
    return arguments.callee._singletonInstance;
  }

  arguments.callee._singletonInstance = this;

  this.Foo = function () {
    // ...
  };
}

var a = new MySingletonClass();
var b = MySingletonClass();
console.log( a === b ); // prints: true

对于那些想要严格版本的人:

(function (global) {
  "use strict";
  var MySingletonClass = function () {

    if (MySingletonClass.prototype._singletonInstance) {
      return MySingletonClass.prototype._singletonInstance;
    }

    MySingletonClass.prototype._singletonInstance = this;

    this.Foo = function() {
      // ...
    };
  };

var a = new MySingletonClass();
var b = MySingletonClass();
global.result = a === b;

} (window));

console.log(result);

关于Javascript:最佳单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1635800/

相关文章:

javascript - 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

javascript - Immutability 和 Singleton 解决的是同一个目的吗?

c++ - 在独立于平台的设计中传递特定于平台的数据?

android - lateinit的isInitialized属性在伴侣对象中不起作用

java - Spring 启动: Multi-layered @Services in RESTful controllers for many inbound requests

c# - C# 中的延迟初始化 "proxy"

ios - 使用自定义 UITableViewCell 显示 Toast 弹出窗口的模式

javascript - 在 elementor 上 lottie 动画结束后离开页面

php - 没有选项,无法选择。如何在 Javascript 中调用数据库中的数据?

javascript - 同步 JQuery 动画的好方法是什么?