в течение некоторого времени, я структурировать свой JavaScript код, как это:Как избежать функции геттер/сеттер в шаблоне модуля при передаче аргументов
;(function() {
function Example(name, purpose) {
this.name = name;
this. purpose = purpose;
}
Example.prototype.getInfo = function() {
return 'The purpose of "' + this.name + '" is: ' + this.purpose;
}
Example.prototype.showInfo = function() {
alert(this.getInfo());
}
var ex = new Example('someModule', 'Showing some stuff.');
ex.showInfo();
})(undefined);
Теперь я понял, что эта модель далека от идеальной, как это имеет некоторые проблемы:
- Он не использует замыкания/сфера так имитируют общественные & частные пользователей ,
- Он не экспортирует что-то, что означает, что сам модуль действительно не инкапсулирован. & namespaced.
(Отказ от ответственности:. Я не использовал его в любом большом проекте, так что я могу отсутствовать некоторые важные детали, которые возникают при работе в реальных условиях живых)
Чтобы решить эти проблемы, я начал искать в шаблоны проектирования JavaScript. Один из шаблонов, который сразу же мне понравился, - это шаблон модуля .
Я попытался переписать код, приведенный выше, используя шаблон модуля, но я не могу получить его совершенно правы:
var Example = (function() {
function getInfo() {
return 'The purpose of "' + name + '" is: ';
}
// Public stuff
return {
name: '',
purpose: '',
setInfo: function(name, purpose) {
this.name = name;
this.purpose = purpose;
},
showInfo: function() {
alert(getInfo());
}
};
})(undefined);
Example.setInfo('someModule', 'Showing some stuff.');
Example.showInfo();
неработающего Пример: Fiddle
Теперь сам модуль инкапсулируются внутри Example
пространства имен & есть что-то вроде публичных & частных членов, но работать с ним совсем не так, как мне кажется, &, возможно потому, что я не могу обернуть голову тем, что нет экземпляра, созданного с использованием ключевого слова new
.
В нерабочем примере почему это предупреждение result
хотя эта строка никогда не установлена & Почему purpose
не предупреждены? Я думаю, что сам метод setInfo
работает, поэтому, вероятно, это проблема с областью, которую я не понимаю.
Кроме того, есть ли способ использовать функции геттера/сеттера? Для меня это в настоящее время выглядит как присвоения я обычно делаю в конструкторе не действительно возможно с помощью шаблона модуля:
function Example(name, purpose) {
this.name = name;
this. purpose = purpose;
}
Использования шаблона модуля, я либо должен пользователя геттер/сеттера или что-то вроде «универсальная функция setter» в форме функции init.
Исходя из PHP OOP, я всегда стараюсь избегать их как можно больше, но я не знаю, как справиться с этим на языке, основанном на прототипе.
Возможно, что-то похожее на шаблон модуля, но с использованием прототипов - что-то вроде модуля & шаблон конструктора? Мне было бы легче понять.
Спасибо за ваш ответ! Код, который вы опубликовали, работает, но где-то в скрипке есть ошибка. Во всяком случае: когда мне не нужны геттеры и сеттеры, то почему в вашем коде есть также метод setInfo? - это не сеттер? – Sven
Моя скрипка не была связана правильно ... Я обновил это. Также это просто исправление кода. – Guanxi