2011-06-21 90 views
3

我有一個Factory類創建了一個Widget對象。 Factory對象需要稍後回調Widget對象的「私有方法」,以傳遞它一些ajax信息。到目前爲止,我唯一實現的方法是在Widget中創建一個公共方法,它將私有方法返回到工廠,然後刪除它自己,然後Factory返回新的Widget,同時保留指向私有方法的指針。下面是一個簡單的例子:javascript中的「朋友類」

function Factory() 
{ 
    var widgetCallback = null; 

    this.ajaxOperation = function() 
    { 
     //some ajax calls 
     widgetCallback('ajaxresults'); 
    } 

    this.getNewWidget = function() 
    { 
     var wid = new Widget(); 
     widgetCallback = wid.getCallback(); 
     return wid; 
    } 

    function Widget() 
    { 
     var state = 'no state'; 
     var self = this; 
     var modifyState = function(newState) 
     { 
      state = newState; 
     } 

     this.getState = function() 
     { 
      return state; 
     } 

     this.getCallback = function() 
     { 
      delete self.getCallback; 
      return modifyState; 
     } 
    } 
} 

有沒有更好的方式來實現後,我還是這是一個相當合理的做法有何影響?我知道它是有效的,只是好奇,如果我正在陷入我應該意識到的任何陷阱。

+4

的JavaScript編輯widgetCallback是JavaScript的,而不是阿達或C++或Java。你可以做什麼語言允許你,但你應該總是問自己,你是否爲了複雜起見而使它變得複雜。簡單的解決方案真的沒有什麼壞處。這是一種腳本語言,而不是軍事工具。 – entonio

+0

雖然我完全同意@entonio,在這裏,我沒有看到任何陷阱。這段代碼看起來不錯。 – mihsathe

+1

@mihsathe這樣寫代碼會導致問題。它的作品,但它不是一個推薦的風格 – Raynos

回答

1
this.getNewWidget = function() { 
    var val = new Widget(), 
     wid = val[0], 
     widgetCallback = val[1]; 

    return wid; 
} 

function Widget() { 
    var state = 'no state'; 
    var self = this; 
    var modifyState = function(newState) { 
     state = newState; 
    } 

    this.getState = function() { 
     return state; 
    } 

    // Return tuple of Widget and callback 
    return [this, modifyState]; 
} 

只是讓你的構造函數返回一個Tuple<Widget, function>

替代只是用封閉範圍,直接在Widget構造

function Factory() { 
    var widgetCallback = null; 

    this.ajaxOperation = function() { 
     //some ajax calls 
     widgetCallback('ajaxresults'); 
    } 

    this.getNewWidget = function() { 
     return new Widget();; 
    } 

    function Widget() { 
     var state = 'no state'; 
     var self = this; 
     // set it directly here! 
     widgetCallback = function(newState) { 
      state = newState; 
     } 

     this.getState = function() { 
      return state; 
     } 
    } 
} 
+0

啊!我愛你的Tuple解決方案,更優雅!謝謝! – Derg

0

我不太熟悉面向對象的JavaScript(我主要使用GWT代碼中的一兩個內襯)來真正地給出一個真正的答案(但是我發現我的回答有點長。 )

我覺得自我修飾的類,聽起來像是gotcha的主要潛力。

我個人比較喜歡JavaScript,Ruby等語言,這些語言在你的能力上並不​​是限制性的(即使我必須在工作中使用Java + GWT,嘿嘿),但是你依賴於自律而不是做什麼愚蠢的東西。我寧願在方法名前添加「_」(並且只是避免在不應該使用的地方使用它),而不是嘗試強制使用私有方法。由於JavaScript本質上不受你可能做什麼瘋狂事情的​​限制,所以它無論如何都需要很多紀律。

如果您在使用後刪除了某個方法;爲了保護它,你能不能像添加新方法一樣輕鬆地做到這一點?你仍然會依靠你(和其他人)的自律和理智,不是嗎?

+0

請用'_'作爲私人/內部方法的前綴,這是事實上的標準。 – Raynos

+0

是的,我記得現在你說了這麼久,因爲我實際上編碼了純JavaScript ......; –

+0

@SteinGStrindhaug如果你濫用破碎的js引擎,你只能添加一個新的方法。 – Raynos