2016-09-22 2 views
0

Я новичок на JS, пытаясь понять, как синглтон работы, и после прочтения много о так много одноплодной шаблон, я делаю вывод, что следующий синглтон шаблон будет работать,Почему мой синглтон не работает?

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; 
 
     } 
 
    } 
 
    }; 
 
})();

Он не выдает никаких ошибок во время выполнения.

Однако, когда я запускаю этот код var abc = singletonIns.getInstance() возвращает undefined, и мы не можем получить доступ к abc.pubVar, почему?

Пожалуйста, объясните, как будто мне исполнилось пять лет.

Заранее спасибо.

+0

Первый раз при запуске этой функции она ничего не возвращает? – adeneo

+0

Я не могу воспроизвести ошибку. Кажется, он работает нормально. – Redu

ответ

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

... а затем что? то вы ничего не возвращаете. Добавьте return instance; после этого, и все будет хорошо.

Вы возвращаете экземпляр, когда он инициирован, но если вы не просто назначаете его, а не возвращаете.

+0

Ничего себе, блестящий hehehe забыл сделать это – 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

вам нужно проверить тип переменной экземпляра, если undefined, тогда вызовите init() иначе, как это есть .. из-за этого вы не смогли получить значение .. вы можете получить доступ к pubVar, что значение потому что это локальная/частная область для этой функции, поэтому для частной переменной вы не можете получить доступ за пределами любой функции. – jsquerylover