1

coffeescript を使用してプライベート メソッドを作成する方法を理解しようとしています。以下はコード例です

class builders
constructor: ->
    // private method
    call = =>
            @priv2Method()
    // privileged method
    privLedgeMethod: =>
            call()
    // privileged method 
    priv2Method: =>
            console.log("got it")

以下は、生成された JS コードです。

(関数() { var ビルダー、 __bind = function(fn, me){ return function(){ return fn.apply(me, 引数); }; }; ビルダー = (関数() { 変数呼び出し、 _これ = これ; 関数ビルダー() { this.priv2Method = __bind(this.priv2Method, this); this.privLedgeMethod = __bind(this.privLedgeMethod, this); } コール = 関数() { builders.priv2Method(); を返します。 }; builders.prototype.privLedgeMethod = function() { リターンコール(); }; builders.prototype.priv2Method = function() { return console.log("了解"); }; ビルダーを返します。 }).call(これ); }).call(これ);

関数定義に「太い矢印」を使用したことに注意してください。コードから得られなかったことがいくつかあります。

  1. _this 変数の用途は何ですか
  2. このコードを : (new builders()).privLedgeMethod() として実行すると、call メソッド内よりも priv2Method メソッドが見つかりません。builders オブジェクトは priv2Method をプロトタイプのプロパティとして表示しますが。

うまくいけば、誰かがここで光を当てることができます。

4

1 に答える 1

1

関数はプライベート メソッドではありませcallん。JavaScript にはそのようなものはないため、CoffeeScript にもそのようなものはありません。

のより正確な説明は次のcallようになります。

buildersクラス内でのみ表示される関数。

callwithを定義すると=>、プライベート クラス メソッドのように動作するものが作成されます。このことを考慮:

class C
    p = => console.log(@)
    m: -> p()

c = new C
c.m()

コンソールを見ると、@内部pにクラスC自体があることがわかります。関数のように見える何かがコンソールに表示されますが、それはすべて CoffeeScript クラスです。そのためvar _this、JavaScript に が表示されます。CoffeeScript が認識=>し、メソッドを定義していない場合、CoffeeScript は標準的なvar _this = thisトリックを使用して、バインドされた関数で参照が正しく表示されるようにします。

またcall、多かれ少なかれ、プライベートクラスメソッドであるため、インスタンスがなく、インスタンスなしでbuildersインスタンスメソッドを呼び出すことはできないことに注意してください。priv2Methodbuilders

あなたのprivLedgeMethod方法:

privLedgeMethod: =>
    call()

call関数(メソッドではない)であるため、正常に機能します。関数はたまたまクラスにバインドされていますが、それでも単なる関数です。したがって@call(). 適切callなクラス メソッドの場合:

@call: -> ...

次に、通常の方法でクラス メソッドとして呼び出します。

@constructor.call()

これは、物事を明確にする簡単なデモです: http://jsfiddle.net/ambiguous/tQv4E/

于 2013-05-16T00:45:45.893 に答える