Шаблон модуля JavaScript - как насчет использования "return this"?
после некоторого чтения о шаблоне модуля я видел несколько способов возврата свойств, которые вы хотите опубликовать.
одним из наиболее распространенных способов является объявление ваших публичных свойств и методов прямо внутри оператора "return", помимо ваших частных свойств и методов. Аналогичный способ ("раскрывающий" шаблон) - предоставить просто ссылки на свойства и методы, которые вы хотите опубликовать. Наконец, третий метод, который я видел, был создайте новый объект внутри функции модуля, которому вы назначаете новые свойства перед возвращением указанного объекта. Это была интересная идея, но требует создания нового объекта.
поэтому я подумал, почему бы просто не использовать 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;
})();
есть ли какие-либо плюсы/минусы в использовании метода выше? А что насчет остальных?
5 ответов
ваша функция не имеет контекста объекта, так 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);
и приехали в уже обсуждаемый шаблон. Дополнительные сведения см. В статье Дастина on обзор анонимных функций.
Я бы рекомендовал стиль, в котором вы добавляете свои общедоступные свойства и методы к анонимному объекту, который вы затем возвращаете:
var myModule = (function() {
function privateMethod() { ... }
function publicMethod() { ... }
return { publicMethod: publicMethod };
})();
Если вы хотите опубликовать методы, сделайте что-то вроде:
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;
})();
другой вариант-избежать этой ссылка в целом. Определите функцию, которая вместо этого создает и возвращает анонимный объект.
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();
выявление шаблонов модулей:
var m1 = (function(){ return {method: mthod} })();
var m2 = new function Singleton(){ return {method: mthod} };
var m3 = ({}).prototype = {method: method};
var m4 = ({}).prototype = (function(){ ... })();
var m5 = (function(){}).prototype = {} || (function(){ ... })();
var m6 = (function(extendee){
return extendee.prototype = {attr3: 'attr3'};
})({currentAttr1: 1, currentAttr2: 2});
кроме того, если вам нужен способ подключения:
var m = (function(){}).prototype = (function(){
var thus = m; // this
console.log('m this-------', thus);
function fn(){
console.log('fn', thus);
return thus;
}
function f(){
console.log('f', thus);
return 'poop';
}
return {f: f, fn: fn};
})();
console.log('M:', m, 'm.fn', m.fn(), 'm.fn.f', m.fn().f());
есть также много способов, и вы можете protagonize а также ваши модули.