Рассмотрят следующий contrived bit of JavaScript на основе revealing module pattern:Использования ECMAScript 5 получить/установить свойство с выявлением модуля шаблона
var RevealingModuleSample = function() {
var moduleName = "DefaultModuleName",
init = function (name) {
moduleName = name
},
issueAlert = function() {
alert(moduleName + " module is running");
}
return {
init: init,
issueAlert: issueAlert
};
}();
RevealingModuleSample.init("SampleModule");
RevealingModuleSample.issueAlert();
Есть ли способ превратить MODULENAME в собственность с методами получения и установками и есть те, методы getter/setter, вызванные внутренними ссылками на moduleName? Чтобы дать конкретный пример, рассмотрит следующее similarly contrived C# example:
public class ContrivedCsharpExample
{
private string _moduleName;
protected string moduleName
{
get {
// Perhaps some logging code here that records the moduleName was retrieved.
return this._moduleName;
}
set {
// Some code here that ensure that a valid moduleName was passed.
this._moduleName = value;
}
}
public void init(string moduleName) {
this.moduleName = moduleName;
}
public void issueAlert() {
Console.WriteLine(this.moduleName);
}
public static void Main()
{
var module = new ContrivedCsharpExample();
module.init("SampleC#Module");
module.issueAlert();
}
}
Обратите внимание, что внутренне к классу, методы вызывают свойства, которые имеют геттер/сеттер. Это позволяет нам добавить дополнительный код внутри этих методов getter/setter, тогда как если бы мы использовали только свойства, доступные вне класса, методы «init» и «issueAlert» должны были бы непосредственно проверять поле и любую логику, которую мы добавили в геттер/сеттер будет обходить.
Проблема, которую я вижу, заключается в том, что в шаблоне раскрывающего модуля переменная «moduleName» не является свойством объекта - это просто переменная, которая в настоящее время находится в области видимости. Поэтому вы не можете просто вытащить его и заменить его парой get/set. Правильно?
There is a related question on StackOverflow, но в этом случае спрашивающий ищет способ возвращения объект с свойством с геттер/сеттер кода, так что внешние пользователи модуля имеют свой доступ к свойству маршрутизации с помощью методов Get/Set , Решение указано прямо в вопросе, но предоставленное решение не позволяет коду, находящемуся внутри модуля, получить доступ к этому свойству без непосредственной работы с переменной, минуя функции get/set.
Я думаю, что это просто невозможно с помощью раскрывающего шаблона модуля, это правильно? Есть ли способ иметь вызовы внутри модуля, направленные через функции get/set?
Должен ли использоваться шаблон раскрывающейся модели? JavaScript использует ключевое слово 'this', если вы хотите. Для меня это не имеет значения. Я могу работать с этим. Это просто вопрос. – PHPglue
Поскольку все эти функции модуля объявлены локально, в любом случае, получатели/сеттеры недоступны извне, и вы все равно должны вытащить ссылки на переменные, я бы рекомендовал заменить их на простые вызовы функций (а не на свойство accessor на надуманный объект). – Bergi