我有兴趣知道的是,如果有更短的方法来实现以下目标:
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 || {};
据我所知,这种格式很好,如果我弄错了,请有人告诉我,我只是想知道是否有更好的方法在我的单身人士上进行初始设置。
提前致谢...
答案 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:{
}
}
}
}
}
}
创建插件:
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() {}