2012-09-21 115 views
0

我正在開發一個JavaScript庫,並希望將不同模塊中的Javascript對象的可選方法組存儲起來。AMD單點JavaScript擴展方法對象

該庫有兩個模塊,我們稱它們爲ModuleA和ModuleB。 ModuleA導出一個類對象,我們稱之爲ClassA,它只具有最小的核心功能。 ModuleB定義了一組在ClassA原型上設置的可選方法。

在第三個模塊不在庫,ModuleC,我想以下幾點:

  • 如果我只導入ModuleA和實例ClassA的,我知道我有機會獲得上使用'InstanceA所有ModuleA方法InstanceA.MethodA(...)」。 (其他方法也可以在InstanceA上定義)

  • 如果我導入ModuleA和ModuleB並實例化ClassA,我知道我可以使用'InstanceA.MethodA(「)訪問InstanceA上的所有ModuleA方法和ModuleB方法。 ..)'和'InstanceA.MethodB(...)'。

我已經考慮了一些解決方案,但我不確定是否有一個首選的方法來實現這一點。以下是我考慮的內容:

ModuleB更改ClassA ModuleB導入ModuleA並更改ClassA的工廠。這些變化會保證持續嗎? AMD是否保證在一個環境中導入相同的模塊始終返回相同的對象?

ModuleB返回改變的ClassA ModuleB擴展ClassA並返回新的Object。在這個例子中,這可能工作得很好,只有兩個模塊,但是多個可選方法模塊呢?

如果您遇到過類似的情況以及您的解決方案,請讓我知道。

+0

順便說一句,這兩種方法的工作。但是,據我所知,第一種方法依賴於非標準行爲。我測試過的模塊加載實現保留了加載模塊的緩存版本。但是,AMD規範似乎沒有任何關於模塊定義副作用的說法。如果這是錯誤的,請糾正我。 –

+1

Dojo AMD Loader [文檔](http://livedocs.dojotoolkit.org/loader/amd):'define'有兩個額外的重要特徵,可能不會立即顯現出來: – phusick

+0

1.模塊創建是惰性的並且是異步的,當調用'define'時不會立即發生。這意味着工廠沒有執行,並且模塊的任何依賴關係都不會被解析,除非某些運行代碼實際需要該模塊。 – phusick

回答

0

這裏是我的方法:

// Module A - Define ClassA 
define(function() { 
    function ClassA() {} 
    ClassA.prototype.methodA = function() {}; 
    return ClassA; 
}); 

// Module B - Extend 
define(function() { 
    return function(ClassToExtend) { 
     ClassToExtend.prototype.methodB = function() { }; 
    }; 
}); 

// Module C - Sticking 
define(function(require) { 

    // Define ClassA 
    var ClassA = require("module_a"); 

    // Extend ClassA with custom methods of ModuleB 
    require("module_b")(ClassA); 

    // Instanciate extended ClassA 
    var InstanceA = new ClassA(); 
} 
+1

我沒有真正考慮過這種方法,但它看起來不錯,並使擴展更加明確。另外需要注意的是,我在ModuleB(擴展模塊)中添加了檢查,以確保不會覆蓋現有屬性。結合phusick描述的模塊加載邏輯,這個工作非常好。 –