2009-10-31 2 views
3

Я вижу этот шаблон много (что я действительно использую), но я хочу объяснить, как это работает.Что это за шаблон/объект в Javascript?

var mystuff = function() { 


    var blah = function() { 

    }; 


    return { 

     setup: function() { 
       blah(); 
     }; 

    }; 


}(); 

Тогда использование очень ООП, как:

mystuff.setup(); 

ответ

6

Что это делает возвращается открытый интерфейс к объекту. Похоже, вы используете функцию setup() для доступа к частной функции blah(). Это один из способов эмуляции публичных и частных функций-членов в объектах Javascript.

Поскольку mystuff определяется с Трейлингом () на дне, он выполняется немедленно, когда анализатор достигает mystuff.setup(), а на самом деле возвращает анонимный объект (ваш публичный интерфейс) с помощью метода setup().

2

Это просто пример nested functions в JavaScript. Хотя метод их вызова может показаться «OOP-подобным» на поверхности, этот стиль очень относится к functional paradigm.

По существу, однако, нет ничего необычного. JavaScript известен как язык, в котором «все является функцией», которая достаточно близка к истине. Все это означает, что любая заявленная функция относится строго к ее родительской сфере.

+0

Причина проголосова? – Noldorin

6

Другие объяснили, как это работает. Это просто дополнительная справочная информация по этой теме.

Это называется "Module pattern" (придумано Douglas Crockford Я верю, но про блог около earlier).

Это дает три основных преимущества:

  1. имен (значение слева от "function")
  2. частный «пространство», чтобы положить вещи в (ПОСРЕДНИКОВ, функции и т.д.), что дон» т необходимость или не должен загрязнять глобальное пространство имен (это вещество перед return заявлением)
  3. Публичного «пространство», чтобы положить вещи, которые вы хотите доступны для пользователей пространства имен (это return заявления)

все в довольно читаемой форме.

0

Это из подхода к функциональному программированию для объектно-ориентированного программирования. Локальные переменные во внешней (анонимной) функции (конструктор) доступны для любой функции, определенной внутри конструктора, но не в другом месте, делая частные переменные частными. Там, где он отличается от чисто функционального подхода, конструктор возвращает объектный литерал, а не другую функцию. Локальные переменные доступны внутренними функциями из-за того, что называется closure.

Используется для создания частных полей & методов в виде локальных переменных.

0

, но я хочу пояснить, как это работает.

Давайте отделим его по частям.

function() { .... } является синтаксисом для анонимной функции.
function() { .... }() определяет и вызывает анонимную функцию в той же строке.

Возвращаемое значение функции в вашем образце является объект, определенный с помощью JSON обозначения (Javscript Notation Object)

{ setup : .... } является объектом с одним атрибутом: это называется setup, и это происходит, чтобы быть функцией, в ваш случай.

так, mystuff получил возвращаемое значение, которое является объектом со свойством (функции) называется setup и mystuff.setup() вызывает эту функцию setup.

Теперь интересная часть, вероятно, так как setup просто вызывает функцию blah, определенную внутри нее, включающую анонимную функцию.

Я считаю, что технический термин здесь closure (смотрите раздел forming closures) (Также см wikipedia определение)

По существу функция становится как модуль самостоятельно, с переменными, связанными с ним.

Это объясняется в crescentfresh's answer

0

Прежде всего, пожалуйста, не такой синтаксис:

var mystuff=function(){...}(); 

Это плохая практика кодирования, поскольку он не является полностью кросс-браузер, как несколько браузеров будет ошибка здесь. Привыкайте положить круглые скобки вокруг функции следующим образом: \

var mystuff=(function(){...})(); 

Nextly, относительно структуры. Этот шаблон более известен как просто «инкапсуляция» в JavaScript. Закрытие - это, возможно, другое, но более конкретно это чисто инкапсуляция в этом случае.

Инкапсуляция просто означает, что вы делаете некоторые члены закрытыми. Что является приватным в этом случае? Ну, переменная blah является приватной в этом случае. Пожалуйста, приучитесь к тому, чтобы приступить к участию в частных лицах, подчеркнув, что они являются частными. Хорошая практика кодирования отличает общедоступные методы от частных методов с подчеркиванием.

<script type="text/javascript"> 
var obj=(function(){ 
    //private members 
    var _p={};//toss all private members into a single object. 
    _p.list=[]; 
    _p.init=function(){ 
     _p.list=[]; 
    }; 

    //public members. use "this" to reference object followed by the method. 
    //however obj._p.list won't be accessible to the global scope 
    return { 
     reset:function() 
     { 
      _p.init(); 
     } 
     ,addName:function(str) 
     { 
      _p.list.push(''+str);//limit to strings 
     } 
     ,getNames:function() 
      { 
      return _p.list.slice(0);//return a clone 
      } 
     ,alertNames:function() 
      { 
      alert(this.getNames().join(",")); 
      } 
     ,getPrivateObj:function() 
      { 
      return _p; 
      } 
    }; 
})(); 

obj.alertNames(); 
obj.addName("Nandan"); 
obj.addName("Ram"); 
obj.alertNames(); 
obj.reset(); 
obj.alertNames(); 
obj.addName("Vinoth"); 
obj.addName("Kevin"); 
obj.alertNames(); 
alert(typeof obj._p);//undefined 
var privateObj=obj.getPrivateObj(); 
alert(typeof privateObj); 
alert(privateObj.list.join("|")); 
</script> 
Смежные вопросы