68

それぞれが独自のJavaScriptファイルに実装されているJavaScript「クラス」がいくつかあります。開発の場合、これらのファイルは個別にロードされ、本番の場合、それらは連結されますが、どちらの場合も、ロード順序を手動で定義する必要があります。BがAを使用する場合は、BがAの後に来るようにします。CommonJS Modules / AsynchronousDefinitionを使用して、この問題を自動的に解決します。

それぞれが1つのクラスをエクスポートするモジュールを定義するよりも、これを行うためのより良い方法はありますか?そうでない場合、モジュールがエクスポートするものにどのように名前を付けますか?以下の例のように、クラス「Employee」をエクスポートするモジュール「employee」は、私には十分に乾燥しているとは感じません。

define("employee", ["exports"], function(exports) {
    exports.Employee = function(first, last) {
        this.first = first;
        this.last = last;
    };
});

define("main", ["employee"], function (employee) {
    var john = new employee.Employee("John", "Smith");
});
4

2 に答える 2

114

AMDの提案では、エクスポートされたオブジェクトの値を返すだけで済みます。ただし、これはAMDプロポーザルの機能であり、単なるAPIプロポーザルであり、モジュールを通常のCommonJSモジュールに戻すのが難しくなることに注意してください。それは大丈夫だと思いますが、知っておくと便利な情報です。

したがって、次のことができます。

コンストラクター関数をエクスポートして大文字で始まるモジュールを好むので、このモジュールの最適化されていないバージョンもEmployee.jsにあります。

define("Employee", function () {
    //You can name this function here,
    //which can help in debuggers but
    //has no impact on the module name.
    return function Employee(first, last) {
        this.first = first; 
        this.last = last;
    };
});

別のモジュールでは、次のようにEmployeeモジュールを使用できます。

define("main", ["Employee"], function (Employee) {
    var john = new Employee("John", "Smith");
});
于 2011-02-02T18:19:28.680 に答える
106

jrburkeの答えに加えて、コンストラクター関数を直接返す必要がないことに注意してください。最も便利なクラスの場合、プロトタイプを介してメソッドを追加することもできます。これは次のように実行できます。

define('Employee', function() {
    // Start with the constructor
    function Employee(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // Now add methods
    Employee.prototype.fullName = function() {
        return this.firstName + ' ' + this.lastName;
    };

    // etc.

    // And now return the constructor function
    return Employee;
});

実際、これはまさにrequirejs.orgのこの例に示されているパターンです。

于 2012-04-23T12:39:40.503 に答える