1

私はcoffeescriptクラスを使用してきましたが、私が知る限り、関数は常に最後のステートメントを自動的に返す必要があります。ただし、コンストラクターオブジェクトで定義された関数は、デフォルトでは何も返さないことがわかりました。どうしてこれなの?

CoffeeScript

constructor: ->
  @ # <~~ returned as expected

class MyClass
  constructor: ->
    @ # <~~ not returned - why?

class MyClass
  constructor: ->
    return ->
      @ # <~~ returned like normal!

JavaScript

var MyClass;

({
  constructor: function() {
    return this;
  }
});

MyClass = (function() {

  function MyClass() {
    this;

  }

  return MyClass;

})();

MyClass = (function() {

  function MyClass() {
    return function() {
      return this;
    };
  }

  return MyClass;

})();
4

2 に答える 2

3

クラスで「new」キーワードを使用すると、「constructor」メソッドが呼び出されます。したがって、戻り値は常に新しいインスタンスであると想定され、戻りたい他の値ではありません。ただし、CoffeeScriptsでは、「return」キーワードを使用して別の戻り値を強制できるようです。

class Foo
  constructor: -> {}

f = new Foo
f instanceof Foo   # expected to be very true...

通常の関数に「コンストラクター」(メソッドではなく=クラス定義の外)という名前を付けると、それはコンストラクターではなく通常の関数であるため、期待どおりに返されます。

于 2012-08-22T20:36:47.287 に答える
2

「コンストラクター」メソッドから別のオブジェクトを返したい場合は、CoffeescriptとJavascriptが「new」演算子をオーバーロードできないため、ファクトリメソッドを作成する必要があります。

 class A
   @create: (params)-> new A params
   constructor: (params)-> console.log params

 a = A.create "foo"
于 2012-08-27T14:35:10.833 に答える