在Javascript中快速创建对象链

时间:2014-01-27 14:51:51

标签: javascript semantics

我有兴趣知道的是,如果有更短的方法来实现以下目标:

App.Plugins = App.Plugins || {};
App.Plugins.SomePlugin = App.Plugins.SomePlugin || {};
App.Plugins.SomePlugin.Models = App.Plugins.SomePlugin.Models || {};
App.Plugins.SomePlugin.Views = App.Plugins.SomePlugin.Views || {};
App.Plugins.SomePlugin.Collections = App.Plugins.SomePlugin.Collections || {};

据我所知,这种格式很好,如果我弄错了,请有人告诉我,我只是想知道是否有更好的方法在我的单身人士上进行初始设置。

提前致谢...

3 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

function defaults(obj, prop) {
    return obj[prop] = obj[prop] || {};
}
defaults(App, 'Plugins');
defaults(App.Plugins, 'SomePlugin');
defaults(App.Plugins.SomePlugin, 'Models');
defaults(App.Plugins.SomePlugin, 'Views');
defaults(App.Plugins.SomePlugin, 'Collections');

答案 1 :(得分:1)

我不明白为什么要这样做

无论如何,写一个更简短的方法是:

App={
 Plugins:{
  SomePlugin:{
   Models:{},
   Views:{},
   Collections:{}
  }
 }
}

然后考虑功能

function defaults(obj, prop) {
    return obj[prop] = obj[prop] || {};
}

将使用

返回错误
defaults(App.Plugins.AnotherPlugin,'Models')
检查这是一个痛苦:

var x={};
if(App&&
   App.Plugins&&
   App.Plugins.AnotherPlugin&&
   App.Plugins.AnotherPlugin.Models
){
 x=App.Plugins.AnotherPlugin.Models
}
console.log(x);

解决方案

var x={};
try{x=App.Plugins.AnotherPlugin.Models}catch(e){}
console.log(x)

这不会给你带来任何错误

但你不能轻易地设置它。

修改

评论答案

然后你应该在没有确定的地方开始检查。在你的情况下你只需要检查anotherPlugin是否存在。你可能已经有App& App.Plugins.so你不需要App = App || {},但只需要App.Plugins.AnotherPlugin

!App.Plugins.AnotherPlugin||App.Plugins.AnotherPlugin=NewPlugin

或函数

function addPlugin(name,newPlugin){
 !App.Plugins[name]||App.Plugins[name]=newPlugin
}

定义自己的标准......我的意思是为什么如果它不存在则返回一个对象?

如果它不存在,你无论如何都无法做任何事情。

并且最大的问题始终是检查它是否存在......就像我上面已经描述的那样,尝试捕获。

EDIT2

检查此功能。

function def(a,b,c,d){
 c=b.split('.');
 d=c.shift();
 a[d]||(a[d]={});
 !(c.length>0)||def(a[d],c.join('.'));
}

用法:

var A={};
def(A,'B.C.D.E.F')
//this transforms your {}
//to 
A:{
 B:{
  C:{
   D:{
    E:{
     F:{
     }
    }
   }
  }
 }
}

http://jsfiddle.net/5NgWL/

创建插件:

var App={}
def(App,'Plugins.SomePlugin.Models')
def(App.Plugins.SomePlugin,'View')
// &/or
def(App,'Plugins.SomePlugin.Collections')

答案 2 :(得分:0)

可以使用它

function namespace(path) {
    var segments = path.split('.'),
        result = {};

    function define(name, obj) {

        if (name === '.') {
            return obj;
        } 

        !obj[name] && (obj[name] = {});
        return define(segments.shift(), obj[name]);
    }

    segments.push('.'); //add stop symbol;
    define(segments.shift(), result);

    return result;
}

namespace('App.Plugins.SomePlugin.Collections').controller = function() {}