Tengo un archivo llamado helpers.js en la carpeta 'ayudantes'. Los contenidos son los siguientes:

class Helpers {
    constructor(config) {
        if (this._singleton) {
            throw new Error('A singleton has already been created.');
        }

        this._singleton = this;
    }

    /**
     * Gets the singleton object.
     * @returns {Helpers}
     */
    static getSingleton() {
        return this._singleton;
    }
}

module.exports = Helpers;

Luego, en /helpers/user.js quiero obtener la instancia singleton del ayudante. Este es mi código:

const helpers  = require('../helpers').getSingleton();

O

const Helpers  = require('../helpers');
const helpers  = Helpers.getSingleton();

El error que sigo recibiendo es:

TypeError: require(...).getSingleton is not a function

O

TypeError: Helpers.getSingleton is not a function

Si paso el mouse sobre Helpers en VSCode, obtengo esta información sobre herramientas

Helpers Tooltip

Y cada vez que paso el mouse sobre getSingleton() obtengo esta información sobre herramientas:

getSingleton() tooltip

Entonces el camino es correcto, pero aún me da los errores.

1
Tvde1 31 oct. 2017 a las 18:53

3 respuestas

La mejor respuesta

La forma más fácil de implementar el patrón singleton en JavaScript es simplemente no exportar la clase en absoluto, p.

class Helpers {}

let helper;
module.exports = function() {
   if (!helper) helpers = new Helpers();
   return helper;
};

// loaded with
var helpers = require('../helpers')(); // note the extra () to call it

O incluso mejor, ya que no estamos restringidos al comportamiento similar a Java, simplemente omita la función por completo y haga

class Helpers {}
module.exports = new Helpers();

// loaded with
var helpers = require('../helpers');

Pero luego si todo su módulo está exportando es una sola instancia de una clase, hay muy pocas razones para usar una clase en primer lugar. También podrías hacerlo

exports.helperMethodOne = function(){};
exports.helperMethodTwo = function(){};
exports.helperMethodThree = function(){};

// loaded with
var helpers = require('../helpers');

O

module.exports = {
  helperMethodOne() {},
  helperMethodTwo() {},
  helperMethodThree() {},
};

// loaded with
var helpers = require('../helpers');
3
loganfsmyth 31 oct. 2017 a las 16:11

Su declaración require es incorrecta, pero es difícil decirle con precisión la sintaxis correcta sin conocer su entorno.

const config = require('/path/to/file');

Es típico. Entonces intenta:

const Helpers = require('../helpers');

Escribiste '../helpers.js' en tu captura de pantalla, no '../helpers'

Obtienes el error:

TypeError: require (...). GetSingleton no es una función

Porque require(...) se resuelve en otra cosa, como null, y null.getSingleton no es una función.


Además, no puede hacer referencia this significativamente dentro de un contexto estático. this solo debe usarse para instancias de clase, no miembros estáticos.

0
Simon Sarris 31 oct. 2017 a las 16:00

Puede hacer algo como esto para usarlo como Singleton.getInstance();

class Singleton {
    static instance = new Singleton();
    static getInstance = () => Singleton.instance;

    constructor() {
        throw new Error('Use Singleton.getInstance()');
    }
}

module.exports = Singleton;

O incluso algo más astuto y úsalo como new Singleton()

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

module.exports = Singleton;
0
Kacper Wiszczuk 31 oct. 2017 a las 16:40