JavaScript枚举示例 - 这是如何工作的?

时间:2010-12-21 20:59:55

标签: javascript enums closures

这段代码来自this answer

我正在努力了解它是如何运作的,但我并没有完全了解它。

我认为发生的事情是TEST_ERROR是一个闭包因此无法更改ErrorValue。一个人会引用这样的值:TEST_ERROR.SUCCESS。如果其中任何一个陈述不正确,请纠正我。

我不明白的是返回声明正在做什么。它返回一个由不同的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 个答案:

答案 0 :(得分:6)

  

TEST_ERROR是一个闭包,因此无法更改ErrorValue。

TEST_ERROR最终将成为匿名函数内return语句中指定的对象。 可以更改此对象。

  

可以引用这样的值:TEST_ERROR.SUCCESS

这是正确的。

  

我不明白的是什么   return语句正在做。它的   返回由...组成的对象   不同的ErrorValues,但返回   它到底是什么?什么回来了   从?什么时候被召唤?

return语句从使用

声明的anonymous function返回

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

最后的()表示匿名函数在声明后被称为立即,并且return块内的值被赋值给{{1 }}

Here是关于闭包和模拟可能有用的私有变量的好文章。

答案 1 :(得分:2)

它将结果返回到TEST_ERROR

var TEST_ERROR = 

立刻被召唤:

})();

这是一种常见的javascript模式。您只为其提供的隐私/范围创建匿名函数,然后立即执行它而不是保留它。

答案 2 :(得分:1)

此代码创建一个名为TEST_ERROR的类。函数ErrorValue是类的构造函数,它定义了两个属性:valuefriendly。该类有两个函数:toString(对于任何给定的实例返回friendly)和valueOf(对于任何给定的实例返回value)。最后,这个类声明了三个类级属性(SUCESSFAILID_ERROR),可以在没有该类实例的情况下访问(类似于C#的static成员)

答案 3 :(得分:0)

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,所以您无法搞清楚自己的价值。

答案 4 :(得分:0)

是的,它本质上是返回一个具有三个成员SUCCESS,FAIL,ID_ERROR的Object,每个成员代表一个ErrorValue。在javascript中,我们可以通过点表示法或索引器访问成员。

无法在对象外部实例化ErrorValue,因为它的范围有限......

答案 5 :(得分:0)

我非常(非常)确定您仍然可以更改值:

TEST_ERROR.FAIL.value = 7;