1

私はcoffeescriptと、javascriptのオブジェクトに非常に慣れています。私はこのコードをcoffeescriptに入れています:

class Animal
constructor: (name) ->
    @name = name
    @upperName: ->
        @name.toUpperCase()
    @greetings ->
        console.log 'Hello %s', @name

this.type = 'Animal'

これは、このjavascriptに「コンパイル」されます。

var Animal
Animal = (function() {
function Animal(name) {
  this.name = name;
  ({
    this.upperName: function() {
      return this.name.toUpperCase();
    }
  });
  this.greetings(function() {
    return console.log('Hello %s', this.name);
  });
}
Animal.type = 'Animal';
return Animal;
})();

あいさつメソッドとupperNameの違いは何ですか?
」はクラスで何をしますか?

ありがとう

4

2 に答える 2

6

シンボルの概要(左= CS、右= JS)

class Animal

identifier: value        Animal.prototype.identifier = value
@identifier: value       Animal.identifier           = value
@identifier= value       Animal.identifier           = value
identifier = value       identifier                  = value  (private var)

他の場所(同じコンパイル結果で並べ替え)

Animal::identifier = value  Animal.prototype.identifier = value
Animal.identifier  = value  Animal.identifier           = value
identifier = value          identifier                  = value
// New:
@identifier = value         this.identifier             = value
identifier: value           { identifier: value}                 (object literal)
@identifier: value          ---INVALID---

CoffeeScriptでは、@はにコンパイルされthisます。

コンストラクトのコンテキストではclass、メソッド定義は@(this)の使用によって影響を受けます。簡単な例を次に示します。

class ClassObject
    instanceMethod: ->
        # This method will be defined on the prototype (available to instance)

    @classMethod: ->
        # This method is defined on the class object itself, not on the instance

    this.classMethod2 = -> # See previous and below
    privateVar = "private"

構文は少し異なりますが、最新の2つは同じコンパイル結果になります。

:クラスブロック内とはどういう意味ですか?」

プロパティを定義するために使用されます。代わりに=(等号)を使用すると、「プライベート」変数が定義されます。

:(コンストラクター)メソッドの内部とはどういう意味ですか?

クラスのレベル外(たとえば、トップレベルコード、関数内、コンストラクターなど)に:は、「特別なクラス」の意味はありません。:オブジェクトリテラル内のキーと名前のペア間の区切り文字です。
指定されたコード@upperName: -> ...は無効であり、最新のCoffeeScriptバージョンではコンパイルされません。ただし、は有効であり、プロパティと関数を値としてupperName: -> ...持つオブジェクトリテラルにコンパイルされます。upperName


コンパイルされたCoffeeScriptコードを見てください:

var ClassObject;

ClassObject = (function() {
  var privateVar;

  function ClassObject() {}

  ClassObject.prototype.instanceMethod = function() {};

  ClassObject.classMethod = function() {};

  ClassObject.classMethod2 = function() {};

  privateVar = "private";

  return ClassObject;

})();
于 2012-10-11T16:11:41.403 に答える
0

作成したインデントのあるコードはコンパイルされません。これが私があなたが意味すると思うことです:

class Animal
  constructor: (name) ->
    @name = name

  upperName: ->
    @name.toUpperCase()

  greetings: ->
    console.log "Hello #{@name}"

それをコンパイルすると、出力はもっと意味のあるものになるはずです。次のコードでこれを実行すると、次のようになります。

a = new Animal 'panda'
console.log a.name
console.log a.upperName()
a.greetings()

期待される出力が得られます。

panda
PANDA
Hello panda

クラス定義は通常のオブジェクト定義に似ています-それらはプロパティと値のセットです。この場合、動物を、すべて関数(コンストラクター、upperName、およびgreetings)である3つのプロパティのセットとして定義しました。

于 2012-10-11T16:02:56.187 に答える