2016-09-22 11 views
0

Ich bin Anfänger auf JS, versuchen, wie Singleton Werke zu verstehen, und nach viel über so viele Singletonmuster Lesen, schließe ich, dass die folgenden Singletonmuster, Warum funktioniert mein Singleton nicht?

var singletonIns = (function() { 
 
    var instance; 
 
    function init() { 
 
    var _pvtVar = 123; 
 
    var pubVar = 111; 
 
    var logPvt = function() { 
 
     console.log(_pvtVar); 
 
    }; 
 
    
 
    return { 
 
     pubVar : pubVar, 
 
     logPvt : logPvt 
 
    }; 
 
    } 
 
    return { 
 
    getInstance : function() { 
 
     if (!instance) { 
 
     instance = init(); 
 
     } else { 
 
     return instance; 
 
     } 
 
    } 
 
    }; 
 
})();

funktionieren würde, Es wirft keinen Fehler auf Laufzeit.

Allerdings, wenn ich diesen Code ausführen var abc = singletonIns.getInstance() es undefined zurückkehrt, und wir können nicht zugreifen abc.pubVar, warum ist das so?

Bitte erklärt, wie ich fünf Jahre alt bin.

Vielen Dank im Voraus.

+0

Das erste Mal, wenn Sie diese Funktion ausführen es nichts zurückkommt? – adeneo

+0

Ich kann den Fehler nicht replizieren. Es scheint gut zu funktionieren. – Redu

Antwort

2
if (!instance) { 
    instance = init(); 

... und was dann? dann gibst du nichts zurück. Fügen Sie danach return instance; hinzu und alles wird gut.

Sie geben die Instanz zurück, wenn sie initiiert wird, aber wenn es nicht ist, weisen Sie sie nur zu und kehren nicht zurück.

+0

Wow, brilliant hehehe vergaß das zu tun – xcode

1

var singletonIns = (function() { 
 
    var instance; 
 
    function init() { 
 
    var _pvtVar = 123; 
 
    var pubVar = 111; 
 
    var logPvt = function() { 
 
     console.log(_pvtVar); 
 
    }; 
 
    
 
    return { 
 
     pubVar : pubVar, 
 
     logPvt : logPvt 
 
    }; 
 
    } 
 
    return { 
 
    getInstance : function() { 
 
     if (typeof instance == 'undefined') { 
 
     instance = init(); 
 
     return instance; 
 
     console.log(instance); 
 
     } else { 
 
     return instance; 
 
     } 
 
    } 
 
    }; 
 
})(); 
 

 
console.log(singletonIns.getInstance());

+0

Sie müssen den Typ der Instanzvariable überprüfen, wenn undefiniert, dann rufen Sie init() sonst wie es ist ... aus diesem Grund konnten Sie keinen Wert erhalten .. Sie können pubVar diesen Wert zugreifen Da es sich um einen lokalen/privaten Bereich für diese Funktion handelt, können Sie auf eine private Variable außerhalb einer beliebigen Funktion nicht zugreifen. Lesen Sie den Scope-Artikel für js – jsquerylover