为什么我不能作为静态字段访问另一个类的公共枚举?

时间:2012-06-25 20:26:06

标签: google-closure-library

我在文件中有一个枚举:

goog.provide('animals.Fish');

animals.Fish = function(obj) {
  this.name_ = obj[animals.Fish.Properties.NAME];
  this.awesomenessLevel_ = obj[animals.Fish.Properties.AWESOMENESS];
}

/**
 * Public list of properties.
 * @enum {string}
 */
animals.Fish.Properties = {
  NAME: 'name',
  AWESOMENESS: 'awesomenessLevel',
}

为什么我不能像这样在另一个类中作为Fish的静态字段访问此枚举?

goog.require('animals.Fish');
...
var tuna = new animals.Fish(
  animals.Fish.NAME: 'tuna',
  animals.Fish.AWESOMENESS: '100'
)
...

1 个答案:

答案 0 :(得分:1)

Closure枚举类型基于来自Java和C ++等语言的Enum Types概念。在Java中,枚举类型定义如下:

  

枚举类型是一种类型,其字段由一组固定的常量组成。常见示例包括罗盘方向(NORTH,SOUTH,EAST和WEST的值)和星期几。

在上面的示例中,animals.Fish.Properties应该表示为record type,因为指定的值不是常量。在下面的示例中,animals.Fish.Properties已重命名为animals.Properties,因此可以应用于任何类型的动物(不仅仅是鱼)。

fish.js

goog.provide('animals.Fish');
goog.provide('animals.Properties');


/** @typedef {{name: string, awesomeness: string}} */
animals.Properties;


/**
 * @param {animals.Properties} properties Animal properties.
 * @constructor 
 */
animals.Fish = function(properties) {
  /** @type {string} */
  this.name_ = properties.name;

  /** @type {string} */
  this.awesomenessLevel_ = properties.awesomeness;
};


/**
 * @return {string} The name of the fish.
 */
animals.Fish.prototype.getName = function() {
  return this.name_;
};

animals_app.js

goog.provide('animals.app');

goog.require('animals.Fish');

animals.app.tuna = new animals.Fish({name: 'tuna', awesomeness: '100'});    
alert(animals.app.tuna.getName()); // alerts 'tuna'


在旁注中,在原始示例中,AWESOMENESS: 'awesomenessLevel'的定义中的animals.Fish.Properties之后不应该有逗号。此外,在第二个文件中,您需要使用完全限定的枚举名称。因此animals.Fish.NAME代替animals.Fish.Properties.NAME而不是{{1}}。