2016-06-30 3 views
2

Я этой ссылке https://addyosmani.com/resources/essentialjsdesignpatterns/book/ понять шаблоны проектирования в JavaScript, я понял, конструктор шаблон, модуль шаблон и модуль раскрывающий шаблон, теперь в Singleton шаблон У меня есть два сомнения, которые следующие:Синглтон шаблон дизайна в Javascript

1) Я знаю C++, и сейчас изучаю JavaScript, поэтому я понимаю, что singleton pattern позволяет вам только один экземпляр класса, но в этой книге упоминается «В JavaScript, Singletons служат в качестве пространства имен общих ресурсов, которые изолируют код реализации от глобального пространства имен, так что чтобы обеспечить единую точку доступа для функций ». Что это значит ???

2)

var mySingleton = (function() { 

// Instance stores a reference to the Singleton 
var instance; 

function init() { 

// Singleton 

// Private methods and variables 
function privateMethod(){ 
    console.log("I am private"); 
} 

var privateVariable = "Im also private"; 

var privateRandomNumber = Math.random(); 

return { 

    // Public methods and variables 
    publicMethod: function() { 
    console.log("The public can see me!"); 
    }, 

    publicProperty: "I am also public", 

    getRandomNumber: function() { 
    return privateRandomNumber; 
    } 

}; 

}; 

return { 

// Get the Singleton instance if one exists 
// or create one if it doesn't 
getInstance: function() { 

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

    return instance; 
} 

}; 

})(); 

var singleA = mySingleton.getInstance(); 
var singleB = mySingleton.getInstance(); 

Мои сомнения, когда мы называем mySingleton.getInstance(); не будет значением «экземпляр» undefined снова, поскольку это локальная переменная, и каждый раз, когда мы вызываем метод getInstance, он должен устанавливать значение экземпляра как неопределенное и, следовательно, , если (! instance)
должен проходить всегда и давать новый но я не понимаю, как он работает здесь. Пожалуйста, объясните.

+0

Нет, 'вар instance' закупоривающего, определенного в«внешней»области. (не в рамках функции 'getInstance') –

+0

Мой совет - посмотреть, какие замыкания находятся в Javascript. –

+0

Спасибо, точка теперь понятна ... но как насчет точки № 1? Просьба объяснить ... – user3651606

ответ

0

1) Это означает, что теперь доступна только переменная var mySingleton из глобального пространства имен. Он предоставляет единый общедоступный метод getInstance, который возвращает один и только один экземпляр класса (код, ответственный за управление частной ссылкой на этот экземпляр, скрыт из внешней области).

2) Нет, var instance определен в «внешней» сфере. (Не входит в комплект getInstance функции)

0

вар mySingleton является функцией IIFE и это возвращает вам объект (или в модуле выявления термин шаблон, предоставляет свойство GetInstance)

Каждый раз, когда mySingleton называется в коде содержимое внутри него выполняется каждый раз. Следовательно, сброс переменной экземпляра. Примечание: метод init также возвращает объект с 3 свойствами , что указывает на то, что они также подвержены экспонату (можно сделать общедоступными, и даже частные переменные можно обнародовать, обработав их в публичной функции. В значительной степени концепции C++/Java).

В конце концов, мы используем этот Init() и пометить его GetInstance

Поэтому, когда я уаг singleA = mySingleton.getInstance(); var singleB = mySingleton.getInstance();

Я могу получить доступ к (выборочно) «разоблаченным» свойствам singleA.publicMethod()

поток: singleA [относится к] деЫпзЬапсу() [экспонируют через] mySingleton [и] деЫпзЬапс() [относится к] инициализации() [который подвергает] publicMethod, и общественная собственность getRandomNumber [который косвенно дает вам доступ к] privateRandomNumber

Сомнение # 1 Служат в качестве пространства имен общих ресурсов и скрыть реализацию кода. Он делится частными свойствами и методами метода init во всем мире, пока вы находитесь в пространстве имен 1 над init.

Частные методы скрыты и не подвергаются.

Сомнение № 2 Каждый раз, когда передается mySingleton, экземпляр повторно объявляется.

Надеется, что это помогает

0

В JavaScript Object представляет собой тип данных, ссылка, которая означает, что экземпляр возвращается здесь же.

var singleA = mySingleton.getInstance(); 
var singleB = mySingleton.getInstance(); 

singleA === singleB // > true 

и тот факт, что мы можем получить доступ к переменному экземпляру в функции GetInstance из mySingleton обусловлен

Смежные вопросы