10

内部クラスインスタンスから内部クラスコンストラクタに外部クラスインスタンスを渡すことを除いて、内部クラスインスタンスから外部クラスフィールドにアクセスする方法がある場合はどうなりますか?

具体的には、簡単な例を示します。

class Test
  constructor: (@number) ->

  class SubTest
    constructor: (@name) ->

    toString: () ->
      console.log @name, @number

  getSubTest: () ->
    return new SubTest "SubTest"

test = new Test 10
test.getSubTest().toString() # SubTest undefined

そこで、「SubTestundefined」ではなく「SubTest10」を取得したいと思います。出来ますか?

4

2 に答える 2

4

朗報です!@自分でクロージャーを作成すると、問題なく機能することがわかります。

class Test
  self = []
  constructor: (@number) ->
    self = @

  class SubTest
    constructor: (@name) ->

    toString: () ->
      @name + self.number

  getSubTest: () ->
    return new SubTest "SubTest"

test = new Test 10
v = test.getSubTest().toString()

alert v

に翻訳:

var Test, test, v;

Test = (function() {
  var SubTest, self;

  self = [];

  function Test(number) {
    this.number = number;
    self = this;
  }

  SubTest = (function() {

    function SubTest(name) {
      this.name = name;
    }

    SubTest.prototype.toString = function() {
      return this.name + self.number;
    };

    return SubTest;

  })();

  Test.prototype.getSubTest = function() {
    return new SubTest("SubTest");
  };

  return Test;

})();

test = new Test(10);

v = test.getSubTest().toString();

alert(v);

出力:

SubTest10

于 2012-08-27T12:13:39.877 に答える
1

これは古い質問ですが、外部クラスの複数のインスタンスが必要な場合(@ costa-shapiroが指摘しているように)、受け入れられた回答は機能しません。これは、内部クラスでクロージャーを作成するための代替アプローチです。

SubTest = (test) ->
  class SubTest
    constructor: (@name) ->

    toString: () =>
      console.log @name, test.number

class Test
  constructor: (@number) ->
    @SubTest = SubTest @

  getSubTest: () =>
    return new @SubTest "SubTest"

test = new Test 10
test.getSubTest().toString()
于 2014-12-15T15:11:01.650 に答える