var company = company || {} ;
company.doSomething = function() {
};
company.test = {};
company.test.submodule = {};
company.test.submodule.doSomething = function() {};
company.api = {};
company.api.submodule = {};
您通常应该避免全局定义变量。对于清晰可维护的代码,使用对象作为命名空间,避免污染全局命名空间。
这也极大地增强了默认的 JS 功能。如果你真的很喜欢它,require.js
在你的项目中添加类似的东西,你会得到一个非常棒的类似 Java 的功能。
因此,使用require.js
,您的company.api
和company.test
可以放置在不同的文件中,并且可以彼此放置require
,就像import company.test
使用 Java一样package
。
命名空间是一种非常有效的做法。你得到:
- 可读性(世界上最重要的事情!!)。
- 可维护性。
- 更快的调试。
- 更快的升级。
- 逻辑和功能的有效划分。
- 防止 IE
window
与global
对象错误。
- 使团队工作变得可能和愉快。
- 加快了开发速度。大多数 IDE 将索引并自动填充您的命名空间对象。
- 您可以有效地使用 jsDoc 标签来记录您的 JavaScript 代码。
重要的
this
在静态上下文中使用它也相当危险。JavaScript 命名约定规定静态将以小写字符开头命名,类将以大写字符开头定义,当然使用 camelCase。
再次,一个非常强大和有用的约定。它告诉开发人员眨眼间某事是静态的或类。例如,如果您有:
company.test.submodule.doSomething = function() {
// this is a static function. It's a normal property, it's not nested under the prototype.
};
相反,如果你想创建一个类,你可以this
以正确的方式使用引用。
// Notice Person starts with uppercase P.
company.test.subModule.Person = function(name) {
this.name = name;
this.numberOfEyes = 2;
};
company.test.subModule.Person.prototype.cryMeARiver = function() {
console.log(this.name + " can cry a river.");
};
现在在任何其他功能中,您可以执行以下操作:
company.api.someSubModule.peopleCryRivers = function() {
// this is again a static context.
var bodgan = new company.test.subModule.Person("Bogdan");
var andreea = new company.test.subModule.Person("Andreea");
bodgan.cryMeARiver();// will output "Bogdan can cry a river."
andreea.cryMeARiver();// will output "Andreea can cry a river."
// etc..
};