2012-07-04 87 views
3

我是一个JavaScript新手,我已经想出了以下方案进行命名空间:Javascript命名空间 - 这是一种特殊的方法吗?

(function() { 
    var ns = Company.namespace("Company.Site.Module"); 

    ns.MyClass = function() { .... }; 

    ns.MyClass.prototype.coolFunction = function() { ... }; 

})(); 

Company.namespace是由简单的创建对象链多达模组脚本注册的功能。

外,在非全局范围:

var my = new Company.Site.Module.MyClass(); 

我特别问有关我隐藏变量ns从全球范围内的方法 - 通过立即执行一个包装的匿名函数。我可以在任何地方写Company.Site.Module,但与将ns存储在局部变量中相比,它不是DRY并且有点麻烦。

你说什么?这种方法有什么缺陷?是否有其他方法被认为更标准?

+0

一个对象@ pimvdb漂亮的想法,但它会看起来有点奇怪与类和方法的多个扩展... – Max

回答

1

您不需要像这样定义类,只有在类之外有全局变量时才需要它。我用这个办法......

MyApp.MyClass = function() { 
}; 

MyApp.MyClass.prototype = { 
    foo: function() { 
    } 
}; 

另外请注意,我用文字为清洁的原型声明

不过,如果你需要范围的全局变量,那么你可以做

(function() { 
    var scopedGlobalVariable = "some value"; 

    MyApp.MyClass = function() { 
    }; 
    MyApp.MyClass.prototype = function() { 
     foo: function() { 
     } 
    }; 
})(); 
1

你的方法对我来说很好。

但是,你也可以做到这一点略有不同,从自动执行功能中返回的“类”:

Company.Site.Module.MyClass = (function() { 
    var MyClass = function() { ... }; 
    MyClass.prototype.foo = function() { ... }; 
    return MyClass; 
})(); 

这条至少所有ns.前缀。名称空间函数仍可用于创建对象,但不在自执行函数之外。

+0

谢谢!问题是我在每个命名空间都有几个类和几个免费函数 - 但是,将你的代码与我的代码结合起来似乎是个好主意 - 用TheClass创建类作为局部变量,剥离类声明中的ns,但外面还有ns。或者你认为这太多了? – Max

+0

听起来对我来说很合理! – Niko

+0

现在upvoting,但我认为这是一个习惯,等待一天,让别人回答之前检查被接受;) – Max

相关问题