Может кто-нибудь объяснить эту структуру ООП JavaScript - PullRequest
2 голосов
/ 13 февраля 2009

Может кто-нибудь объяснить эту структуру JavaScript ООП?

Я понимаю, что это то, как вы создаете «объекты» в javascript, просто нужно немного пояснить обозначения и что это значит:

 var vote = function(){
     return {
            P1: function() {
                alert('P1');
            },

            P2: function() {
                alert('P2');
            }          

        };

    }();

    vote.P1();
    vote.P2();
  1. Почему открытые методы в обратном вызове? Как это возможно? Разделенные запятыми?

  2. Почему конец «объекта» должен быть ();

  3. Соглашение об именах для внутренних и открытых методов?

  4. Являются ли открытые свойства и методы одинаковой структурой? В чем разница?

Ответы [ 4 ]

12 голосов
/ 13 февраля 2009
var vote = function(){
    var privateMember = 3; // lets define a private member, this will only be available inside the function scope, so we can't do "vote.privateMember" because we're not returning it below

    // It's returning an object, {}
    // these are considered public because they are returned by the function, making them available outside the function scope using the "dot" operator, "vote.P1()"
    return {
        // first value of the object is a function
        // so we can call this like "vote.P1()"
        // we're calling a privateMember in here
        P1: function() {
            alert('P1');
            alert(privateMember);
        },
        // second value of the object is a function
        // so we can call this like "vote.P2()"
        P2: function() {
            alert('P2');
        }          
    };
}(); // () means it will execute the function, so "vote" will store the return value of this function, it's a shorthand for `var vote = function(){}; vote = vote();

Соглашение об именах для частных методов обычно ставит подчеркивание перед именем метода / свойства _privateMethod: function(){}.

2 голосов
/ 14 февраля 2009

Три важных понятия: анонимные функции, литералы объектов, замыкание.

Анонимные функции

Вы можете объявлять и выполнять функцию, не назначая ее переменной. В вашем примере foo - это не функция, это результат вызова:

var item = function(){ /*function code here*/ }**()**; <- Поскольку функция выполняется, элемент - это объект, который возвращает функция, а не функция. </p>

Литералы объектов

Скажем, вы сделали это: var a = new Object(); a.foo = 'bar';
Буквенное обозначение объекта будет выглядеть так: var a = {foo: 'bar'};

В вашем примере ваша анонимная функция возвращает новый объект с двумя функциями, P1 и P2. Это просто другое обозначение для определения объектов.

Закрытие

Когда функция возвращает объект, этот объект сохраняет доступ к области действия функции - это называется закрытием. Итак, если вы сделаете это:

var a = function(){
  var _pvt = 'foo';
  return {
    aFunc: function(){alert(_pvt);}
  };
}();
a.aFunc();

_pvt является анонимной функцией. Эта функция возвращает новый объект одним методом (aFunc). Область действия анонимной функции доступна этому объекту через замыкание, поэтому при вызове a.aFunc() будет доступно _pvt.

Лучшее место, чтобы узнать об этом - видео Дугласа Крокфорда на YUI Theatre: http://video.yahoo.com/watch/111585/1027823

2 голосов
/ 13 февраля 2009
  1. Возвращает объект / хеш. Обратите внимание, что сразу после возврата {является началом объекта / хэша.

  2. для запуска анонимной функции, которая возвращает объект.

  3. Я не знаю, что вы имеете в виду.

  4. Да, они одинаковы. Свойство может быть функцией, потому что в JavaScript есть функции первого класса.

Этот код придуман, поэтому трудно сказать что-нибудь полезное об этом. Я не уверен, что авторы намеревались. Похоже, что он, возможно, стремился создать классоподобную вещь, в отличие от того, как javascript делает OO на основе прототипов. Этот код мог быть так же легко написан.

var vote = {

        P1: function() {
            alert('P1');


        },

        P2: function() {
            alert('P2');
        }          

    };
1 голос
/ 13 февраля 2009

Это JSON (нотации объектов javascript). Это похоже на формат словаря в Python.

Массивы могут быть определены встроенными с помощью

[1,2,3,4,5] 

и объекты могут быть определены в строке, используя

{ field1: value1, field2: value2, field3: value3 }

Функция также может быть определена как встроенная,

var a = function() { .... } //a is a function

() после функции используется для вызова функции сразу после ее определения! Поскольку функция определена как встроенная, это все равно что сказать:

x = function() { ... }
y = x();

но сжато как:

y = function(){...} ();

Насколько я знаю, нет открытых или закрытых, все они открытые, и функции не отличаются от переменных, просто их тип является функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...