2013-05-15 50 views
0

我想了解如何使用coffeescript創建私有方法。下面是一個示例代碼Coffeescript-Javascript關聯

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

以下是所生成的JS代碼。

 

(function() { var builders, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; builders = (function() { var call, _this = this; function builders() { this.priv2Method = __bind(this.priv2Method, this); this.privLedgeMethod = __bind(this.privLedgeMethod, this); } call = function() { return builders.priv2Method(); }; builders.prototype.privLedgeMethod = function() { return call(); }; builders.prototype.priv2Method = function() { return console.log("got it"); }; return builders; }).call(this); }).call(this);

請注意,我用「胖箭頭」的功能定義。有幾件事我沒有從代碼中得到。

  1. 什麼用的_this可變
  2. ,如果你運行該代碼爲:比調用方法沒有找到priv2Method方法中(新的建設者())privLedgeMethod()。即使構建器對象確實將priv2Method顯示爲其原型的屬性。

希望有人可以在這裏說明一些情況。

回答

0

您的call函數不是私有方法,JavaScript中沒有這樣的東西,因此CoffeeScript中沒有這樣的東西。

call更準確的描述應該是:

一個函數,只有builders類中可見。

=>定義call創造東西表現得如同一個私有的類方法。試想一下:

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

c = new C 
c.m() 

如果您在控制檯看,你會發現裏面@pC本身,你會看到東西,看起來像一個功能控制檯,但僅此而已CoffeeScript的一類。這就是爲什麼你在JavaScript中看到var _this。當CoffeeScript看到=>並且您沒有定義方法時,CoffeeScript使用標準的var _this = this技巧來確保引用在綁定函數中正確出現。

另外請注意,您的call是,或多或少,私人方法,所以沒有builders實例,你不能調用實例方法priv2Method沒有builders實例。

privLedgeMethod方法:

privLedgeMethod: => 
    call() 

將正常工作,因爲call是一個函數(不是方法),該功能恰好是綁定到類,但它仍然只是一個功能。因此,當您call()時缺少@前綴。如果call是正確的類方法:

@call: -> ... 

,那麼你會稱其爲以通常的方式一類方法:

@constructor.call() 

這裏有一個簡單的演示,可能澄清事情:http://jsfiddle.net/ambiguous/tQv4E/