После выполнения некоторого чтения о Шаблоне Модуля я видел несколько способов возвратить свойства, которые Вы хотите быть общедоступными.
Один из наиболее распространенных способов состоит в том, чтобы объявить Ваши общественные собственности и методы прямо в оператора "возврата" кроме Ваших частных собственностей и методов. Похожий способ ("Разоблачающий" шаблон) состоит в том, чтобы обеспечить просто ссылки на свойства и методы, которые Вы хотите быть общедоступными. Наконец, третья техника, которую я видел, состояла в том, чтобы создать новый объект в Вашей функции модуля, к которой Вы присваиваетесь, Ваши новые свойства прежде, чем возвратиться сказали объект. Это было интересной идеей, но требует создания нового объекта.
Таким образом, я думал, почему не просто используют this.propertyName
присваивать Ваши общественные собственности и методы, и наконец использовать return this
в конце? Этот путь кажется намного более простым мне, поскольку можно создать частные собственности и методы с обычным var
или function
синтаксис или использование this.propertyName
синтаксис для объявления открытых методов.
Вот метод, который я предлагаю:
(function() {
var privateMethod = function () {
alert('This is a private method.');
}
this.publicMethod = function () {
alert('This is a public method.');
}
return this;
})();
Там какие-либо профессионалы/недостатки к использованию метода выше? Что относительно других?
У вашей функции нет контекста объекта, поэтому this
в данном случае ссылается на глобальный объект window
. Каждое свойство, которое вы назначаете this
, автоматически загрязняет глобальное пространство имен.
(function() {
console.log(this == window); // true
this.publicMethod = function () {
alert('This is a public method.');
}
})();
console.log(publicMethod); // function()
Вы можете явно передать ему объект, чтобы указать, какой контекст использовать.
var MYAPP = {};
(function() {
// 'this' will now refer to 'MYAPP'
this.publicMethod = function () {
alert('This is a public method.');
}
}).call(MYAPP);
console.log(publicMethod); // undefined
console.log(MYAPP.publichMethod); // function()
Что вы можете написать в несколько ином стиле:
var MYAPP = (function(my) {
var my;
⋮
return my;
})(MYAPP);
И мы подошли к уже обсуждавшемуся шаблону . Для получения дополнительной информации см. Статью Дастина о Scoping anonymous functions .
если вы хотите опубликовать методы, сделайте что-нибудь вроде:
var export = (function() {
var privateMethod = function () {
alert('This is a private method.');
}
var export = {};
export.publicMethod = function () {
alert('This is a public method.');
}
return export;
})();
Я бы порекомендовал стиль, в котором вы добавляете свои общедоступные свойства и методы к анонимному объекту, который вы затем возвращаете:
var myModule = (function() {
function privateMethod() { ... }
function publicMethod() { ... }
return { publicMethod: publicMethod };
})();
Другой вариант - вообще отказаться от ссылки this . Вместо этого определите функцию, которая создает и возвращает анонимный объект.
function makeThing(someAttribute) {
var privateVariable = 42;
function someMethod() {
return privateVariable;
}
return {
"publicMethodName": someMethod,
"getAttribute": function() {
return someAttribute;
}
};
}
var thing = makeThing(99);
thing.publicMethodName();
thing.getAttribute();