Шаблон Модуля JavaScript - Что относительно того, чтобы использовать “возвращает это”?

После выполнения некоторого чтения о Шаблоне Модуля я видел несколько способов возвратить свойства, которые Вы хотите быть общедоступными.

Один из наиболее распространенных способов состоит в том, чтобы объявить Ваши общественные собственности и методы прямо в оператора "возврата" кроме Ваших частных собственностей и методов. Похожий способ ("Разоблачающий" шаблон) состоит в том, чтобы обеспечить просто ссылки на свойства и методы, которые Вы хотите быть общедоступными. Наконец, третья техника, которую я видел, состояла в том, чтобы создать новый объект в Вашей функции модуля, к которой Вы присваиваетесь, Ваши новые свойства прежде, чем возвратиться сказали объект. Это было интересной идеей, но требует создания нового объекта.

Таким образом, я думал, почему не просто используют 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;

})();

Там какие-либо профессионалы/недостатки к использованию метода выше? Что относительно других?

14
задан Kevin Brown 20 February 2015 в 01:38
поделиться

4 ответа

У вашей функции нет контекста объекта, поэтому 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 .

30
ответ дан 1 December 2019 в 07:05
поделиться

если вы хотите опубликовать методы, сделайте что-нибудь вроде:

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;

})();
2
ответ дан 1 December 2019 в 07:05
поделиться

Я бы порекомендовал стиль, в котором вы добавляете свои общедоступные свойства и методы к анонимному объекту, который вы затем возвращаете:

var myModule = (function() {
    function privateMethod() { ... }
    function publicMethod() { ... }

    return { publicMethod: publicMethod };
})();
4
ответ дан 1 December 2019 в 07:05
поделиться

Другой вариант - вообще отказаться от ссылки 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();
2
ответ дан 1 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: