2017-10-31 3 views
1

nicht aufrufen Ich habe eine Datei mit dem Namen helpers.js im Ordner "Helfer". Die Inhalte sind wie folgt:kann statische Funktion auf ES6 Klasse

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; 

Dann in /helpers/user.js ich die Helfer Singleton-Instanz erhalten möchten. Dies ist mein Code:

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

oder

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

Der Fehler, den ich immer halten ist:

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

oder

TypeError: Helpers.getSingleton is not a function 

Wenn ich über Helpers in VSCode schweben , Ich erhalte diese Tooltip

Helpers Tooltip

Und wenn ich über getSingleton() schweben ich diesen Tooltip erhalten:

getSingleton() tooltip

Also der Weg ist richtig, aber es gibt mir immer noch die Fehler.

+0

Aus Ihrer Beschreibung, es klingt wie Sie haben: 'Helfer/helpers.js' und' Helfer/user.js', so Sie möchten 'require ('./ helpers')' oder 'require ('./ helpers.js')'. Angenommen, das ist nicht das Problem, was gibt 'console.log (typeof Helpers)'? Was ist mit 'console.log (typeofHelpers.getSingleton)'? –

+2

Auch wenn Sie den Fehler nicht erhalten haben, funktioniert der Code nicht. 'this' innerhalb der statischen Methode bezieht sich auf etwas anderes als' this' im Konstruktor. Auch so funktionieren Singletons nicht. 'getSingleton()' müsste eine neue Instanz (beim ersten Aufruf) instanziieren und diese zurückgeben. –

Antwort

2

Die einfachste Möglichkeit, das Singleton-Muster in JavaScript zu implementieren, besteht darin, die Klasse überhaupt nicht zu exportieren, z.

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 

oder noch besser, da wir auf Java-ähnliches Verhalten nicht beschränkt sind, lassen Sie die Funktion vollständig und tun

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

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

aber dann wenn alle Modul Export ist ein Einzel- Instanz einer Klasse, gibt es sehr wenig Grund, eine Klasse an erster Stelle zu verwenden. Genauso gut könnte man tun

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

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

oder

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

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

Ihre require-Anweisung ist falsch, aber es ist schwer, Ihnen genau die richtige Syntax zu geben, ohne Ihre Umgebung zu kennen.

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

ist typisch. So versuchen:

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

Sie schrieb '../helpers.js' in Ihrem Screenshot, nicht '../helpers'

Sie erhalten den Fehler:

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

Da require(...) etwas löst anderes, wie null und null.getSingleton ist keine Funktion.


Sie können aber auch nicht this Referenz meaninfully in einem statischen Kontext. this sollte nur für Klasseninstanzen verwendet werden, nicht für statische Member.

+0

Ich habe sowohl '../ Helfer' als auch' ../ helpers.js' ausprobiert, aber es sollte keinen Unterschied machen von dem, was ich gesehen und benutzt habe. – Tvde1

+0

Und wenn das 'require()' 'null zurückgibt, sollte es mir dann nicht eine 'Kann nicht lesen Eigenschaft' getSingleton 'von undefined' Fehler geben? – Tvde1

0

Sie können etwas tun es als Singleton.getInstance() zu verwenden;

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

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

module.exports = Singleton; 

oder sogar etwas mehr hinterhältig und es verwenden, wie new Singleton()

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

module.exports = Singleton;