1

我在文件中有一个枚举:

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'
)
...
4

1 回答 1

1

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

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

在上面的示例中,animals.Fish.Properties可能应该表示为记录类型,因为分配的值不是常量。在下面的示例中,animals.Fish.Properties已重命名animals.Properties,以便它可以应用于任何类型的动物(不仅仅是鱼)。

鱼.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_;
};

动物应用程序.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.

于 2012-06-25T21:27:55.670 回答