Пример перечисления JavaScript - как это работает? - PullRequest
4 голосов
/ 21 декабря 2010

Этот бит кода от этого ответа .

Я пытаюсь понять, как это работает, но я не понимаю всего этого.

Я думаю, что происходит, что TEST_ERROR является закрытием, поэтому ErrorValue нельзя изменить. Можно сослаться на значение, подобное этому: TEST_ERROR.SUCCESS. Пожалуйста, исправьте меня, если любое из этих утверждений неверно.

Что я не понимаю, так это то, что делает оператор return. Он возвращает объект, состоящий из разных ErrorValues, но возвращает его во что? И с чего оно возвращается? А когда это называется?

var TEST_ERROR = (function() {
  function ErrorValue(value, friendly) {
    this.value = value;
    this.friendly = friendly;
  }
  ErrorValue.prototype = {
    toString: function() { return this.friendly; },
    valueOf: function() { return this.value; }
  };
  return {
    'SUCCESS': new ErrorValue(0, 'Success'),
    'FAIL': new ErrorValue(1, 'Fail'),
    'ID_ERROR': new ErrorValue(2, 'ID error')
  };
})(); 

Спасибо!

Пол

Ответы [ 6 ]

6 голосов
/ 22 декабря 2010

TEST_ERROR является закрытием, поэтому ErrorValue не может быть изменено.

TEST_ERROR в конечном итоге будет просто объектом, указанным в операторе возврата внутри анонимной функции. Этот объект можно изменить.

Можно ссылаться на такое значение: TEST_ERROR.SUCCESS

Это верно.

Что я не понимаю, так это то, что делает оператор return.Он возвращает объект, состоящий из разных ErrorValues, но возвращает его во что?И с чего оно возвращается?И когда он вызывается?

Оператор return возвращается из анонимной функции , которая объявлена ​​с

(function() { ...})();

() в конце означает, что анонимная функция вызывается сразу после ее объявления, а значение внутри блока return присваивается TEST_ERROR

Вот хорошая статья о замыканиях и эмуляции частных переменных, которые могут быть полезны.

2 голосов
/ 22 декабря 2010

Возвращает свой результат в TEST_ERROR

var TEST_ERROR = 

и вызывается немедленно:

})();

Это распространенный шаблон javascript.Вы создаете анонимную функцию только для обеспечения конфиденциальности / охвата, которую она обеспечивает, а затем немедленно выполняете ее, а не сохраняете ее.

1 голос
/ 22 декабря 2010

Этот код создает класс с именем TEST_ERROR. Функция ErrorValue является конструктором класса, который определяет два атрибута: value и friendly. Класс имеет две функции: toString (который возвращает friendly для любого данного экземпляра) и valueOf (который возвращает value для любого данного экземпляра). Наконец, этот класс объявляет три атрибута уровня класса (SUCESS, FAIL и ID_ERROR), к которым можно обращаться без экземпляра этого класса (вроде как static членов C #).

0 голосов
/ 22 декабря 2010

Я довольно (очень) уверен, что вы все еще можете изменить значения:

TEST_ERROR.FAIL.value = 7;
0 голосов
/ 22 декабря 2010

Да, это, по сути, возврат Объекта с тремя членами SUCCESS, FAIL, ID_ERROR, каждый из которых представляет ErrorValue.В javascript мы можем получить доступ к членам через точечную нотацию или через индексатор.

ErrorValue не может быть создан вне объекта, поскольку его область действия ограничена ...

0 голосов
/ 22 декабря 2010
var TEST_ERROR = ( // these parenthesis evaluate the function expression

function() { // anonymous function
  function ErrorValue(value, friendly) {
    this.value = value;
    this.friendly = friendly;
  }
  ErrorValue.prototype = {
    toString: function() { return this.friendly; },
    valueOf: function() { return this.value; }
  };

  // return an object from the function
  return {
    'SUCCESS': new ErrorValue(0, 'Success'),
    'FAIL': new ErrorValue(1, 'Fail'),
    'ID_ERROR': new ErrorValue(2, 'ID error')
  };
}
) 
(); // call the evaluated function which returns the "enum" object and assign
    // that value to TEST_ERROR

Так что да TEST_ERROR будет иметь значение {SUCCESS: ..., FAIL: ..., ID_ERROR: ...}, и вы не можете связываться с их значениями, поскольку у вас нет доступа к ErrorValue.

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