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

animal_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。さらに、2 番目のファイルでは、完全修飾列挙名を使用する必要があります。したがって、代わりにanimals.Fish.NAMEになりますanimals.Fish.Properties.NAME

于 2012-06-25T21:27:55.670 に答える