基本JavaScript对象结构有助于访问属性

时间:2015-10-26 06:29:45

标签: javascript

(function (window, document, $, undefined) {
    "use strict";
    //we cache a few useful values, like jQuery wrapped window and document
    var $window = $(window),
      $document = $(document),

    ProjectManagement = {

        // Cache Properties
        cache: {
          jsonPromiseCache: {},
        },

        init: function(){
            console.log('ProjectManagement.init() Function ran');

            // Call the User module
            ProjectManagement.modules.User.populateUserlistJson('test userlistJsonData data');
        },

        modules: {
            User: {},
            Milestones: {},
            Tasks: {},
        },
    };

    // Run Init on DOM Ready
    $(function() {
        ProjectManagement.init();
    });

}(this, document, jQuery));

基于上面这个确切的代码结构。如何将具有类似样式函数和属性的Object加载到此属性中:

ProjectManagement.modules.User

这样的内容会加载到上面的代码中,我有ProjectManagement.modules.User ...

(function(){
    ProjectManagement.modules.User = {

        cache: {
            userlistJson: '',
        },


        init: function(){
            console.log('ProjectManagement.modules.User.init() Function ran');
        },

        populateUserlistJson: function(userlistJsonData){
            ProjectManagement.modules.User.cache.userlistJson = userlistJsonData;

            console.log('ProjectManagement.modules.User.populateUserlistJson(userlistJsonData) Function ran from ProjectManagement.init()', userlistJsonData);

        },

        getUsers: function(){

        },
    };
})();

使用JSFiddle演示进行更新

http://jsfiddle.net/jasondavis/cpvsado1/

在演示中,我收到此错误Uncaught TypeError: ProjectManagement.modules.User.populateUserlistJson is not a function - line 44

第44行是ProjectManagement.modules.User.populateUserlistJson('test userlistJsonData data');,它位于ProjectManagement.init()函数内。

如果我尝试将ProjectManagement.modules.User的代码放在ProjectManagement的代码之上,那么我会在下面收到此错误,因为我的ProjectManagement对象尚未定义:

Uncaught ReferenceError: ProjectManagement is not defined - line 25  

第25行是用户对象代码的开头:ProjectManagement.modules.User = {

我正在寻找帮助修改ProjectManagement.modules.User代码,以便我可以在我的核心ProjectManagement对象中访问此函数和属性。

我的真实项目有大约6,000行代码,我不想完全改变它的核心结构,但是我的"模块的结构"可以根据需要进行更改,以便能够以我描述的方式工作。

在我的核心ProjectManagement对象中,我希望能够简单地将代码加载到每个模块的页面中,并且可以在ProjectManagement obnject

1 个答案:

答案 0 :(得分:2)

此处的主要问题:ProjectManagement是一个局部变量,因此无法从另一个函数访问。

您可以将此对象添加到window对象,并将其用作全局对象。

JSFiddle

您也可以将此对象传递给函数:

(function (window, document, $, undefined) {
    "use strict";
    //we cache a few useful values, like jQuery wrapped window and document
    var $window = $(window),
      $document = $(document),

    ProjectManagement = {

        // Cache Properties
        cache: {
          jsonPromiseCache: {},
        },

        init: function(){
            console.log('ProjectManagement.init() Function ran');

            // Call the User module
            ProjectManagement.modules.User.populateUserlistJson('test userlistJsonData data');
        },

        modules: {
            User: {},
            Milestones: {},
            Tasks: {},
        },
    };

    // Run Init on DOM Ready
    $(function() {
        ProjectManagement.init();
    });
  
    window.ProjectManagement = ProjectManagement;

}(this, document, jQuery));

(function(ProjectManagement){
    ProjectManagement.modules.User = {

        cache: {
            userlistJson: '',
        },


        init: function(){
            console.log('ProjectManagement.modules.User.init() Function ran');
        },

        populateUserlistJson: function(userlistJsonData){
            ProjectManagement.modules.User.cache.userlistJson = userlistJsonData;

            console.log('ProjectManagement.modules.User.populateUserlistJson(userlistJsonData) Function ran from ProjectManagement.init()', userlistJsonData);

        },

        getUsers: function(){

        },
    };
})(window.ProjectManagement);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>