0

最初に名前空間を定義するモジュール定義メソッドを最上位の名前空間に追加しようとしています。例えば、

APP.define('modules.moduleName', function () { 
    return {name: 'Module 1' }; 
});

しかし、私の実装では、割り当ての問題があるようです。これが私の実装の簡単な例です。

var APP = APP || {};
APP.namespace = function( nsString ) {

    var parts  = nsString.split('.'),
        parent = this,
        i;

    if (parts[0] === 'APP') {
        parts = parts.slice(1);
    }

    for ( i = 0; i < parts.length; i++ ) {
        if (typeof parent[parts[i]] === 'undefined') {
            parent[parts[i]] = {};
        }
        parent = parent[parts[i]];
    }

    return parent;
};

// Simplified example of my define function
APP.define = function( name, definition ) {
    var namespace = APP.namespace( name );

    namespace     = definition();
    return namespace;
};

// Example Module
APP.define('modules.example', function () {

    return {
        name   : 'Application',
        module : 'APP.module'
    };
});

ただし、に割り当てた後、APP名前空間の下に名前空間が割り当てられていないようdefinition()です。しかしvar module = APP.define('module.example', function () { /*...*/ })、動作します。これも機能します:

APP.define = function( name, definition ) {
    var namespace = APP.namespace( name );
    var module    = definition();

    for (var prop in module) {
        if (module.hasOwnProperty[prop]) {
            namespace[prop] = module[prop];
        }
    }
    return namespace;
};

私が見逃しているオブジェクト参照またはコールバック スコープに関する何かがあるに違いありません。

4

1 に答える 1

0

var namespace を APP.namespace( name ) に割り当てると、参照によって名前空間の最後の部分を取得しますがnamespace = definition()、名前空間変数をdefinition関数の結果に再定義するだけです。

APP.namespaceandをマージして、APP.define最後の親が名前空間の最後の部分をプロパティとしてdefinition関数に割り当てることができます

コードは次のとおりです。

var APP = APP || {};
APP.define = function( nsString, definition) {

    var parts  = nsString.split('.'),
        parent = this,
        i;

    if (parts[0] === 'APP') {
        parts = parts.slice(1);
    }

    for ( i = 0; i < parts.length - 1; i++ ) {
        if (typeof parent[parts[i]] === 'undefined') {
            parent[parts[i]] = {};
        }
        parent = parent[parts[i]];
    }

    parent[parts.pop()] = definition();
};
于 2012-12-14T19:58:45.763 に答える