-
-
Save you-think-you-are-special/e4a89de3ae347b1d4d76 to your computer and use it in GitHub Desktop.
| 'use strict'; | |
| /** | |
| * Created by Alexander Litvinov | |
| * Email: [email protected] | |
| * May be freely distributed under the MIT license | |
| */ | |
| let singleton = Symbol(); | |
| let singletonEnforcer = Symbol(); | |
| class Singleton { | |
| /** | |
| * @param enforcer | |
| */ | |
| constructor(enforcer) { | |
| if (enforcer !== singletonEnforcer) { | |
| throw "Cannot construct singleton" | |
| } | |
| } | |
| /** | |
| * @returns Singleton | |
| */ | |
| static get instance() { | |
| if (!this[singleton]) { | |
| this[singleton] = new Singleton(singletonEnforcer); | |
| } | |
| return this[singleton]; | |
| } | |
| } | |
| export default Singleton; |
Also
//this function could be called outside of a class to make a class a singleton, however, the class's constructor cannot take in any arguments for this to work.
function makeSingleton2(theClass){
const instance = new theClass();
eval(theClass.name + "= () => instance") //Chrome doesn't support arrow function yet, but I believe I used it properly.
}@mrme44 You should use babel man ! Work with ES6 now anywhere !
@schankam, I'll have to check Babel out. I tried using some other ES6 transpiler once; I don't remember what it was called, but it didn't work out so well.
If I understand CommonJS + the browser implementations correctly, the output of a module is cached, so export default new MyClass() will result in something that behaves as a singleton (only a single instance of this class will ever exist per process/client depending on env it's running in).
@StevenLangbroek export default new MyClass() pattern is using in ReactJS dispacher which is a single component for a ReactJS app. I think, you are correct about it.
Refer: https://gist.github.com/milankarunarathne/c565aa5970987aeca88b
Couldn't one get around this by calling
new Singleton(singletonEnforcer). A function would, however, have to be injected into the Singleton class to gain access to singletonEnforcer. Chrome does not yet supported ES6 modules, so I can't actually test this out yet :(.I have come up with the following function that I've been using to create singletons. There is a way around this method too. See if you can figure it out ;).
I use this function
Any class can then be made into a singleton by calling
makeSingleton(this)in the constructor.