命名规范
另外一种可以提升你代码的可预测性和可维护性的方法是采用命名规范。也就是说变量和函数的命名都遵守同样的习惯。
下面是一些建议的命名规范,你可以原样采用,也可以根据自己的喜好作调整。同样,遵循规范要比规范本身是什么样更加重要。
构造函数命名中的大小写
JavaScript中没有类,但有构造函数,可以通过new
来调用构造函数:
var adam = new Person();
由于构造函数毕竟还是函数,如果只通过函数名就可分辨出它是构造函数还是普通函数是非常有用的。
首字母大写可以提示你这是一个构造函数,而首字母小写的函数一般只认为它是普通的函数,不应该通过new来调用它:
function MyConstructor() {...}
function myFunction() {...}
下一章将介绍一些强制将普通函数用作构造函数的编程模式,但遵守我们所提到的命名规范会更好的帮助程序员阅读源码。
单词分隔
当你的变量名或函数名中含有多个单词时,单词之间的分隔也应当遵循统一的规范。最常见的是“驼峰式”(camel case)命名,单词都是小写,每个单词的首字母是大写。
对于构造函数,可以使用“大驼峰式”(upper camel case)命名,比如MyConstructor()
,对于函数和方法,可以采用“小驼峰式”(lower camel case)命名,比如myFunction()
、calculateArea()
和getFirstName()
。
那么对于那些不是函数的变量应当如何命名呢?变量名通常采用小驼峰式命名,还有一个不错的做法是,变量所有字母都是小写,单词之间用下划线分隔,比如,first_name
、favorite_bands
和old_company_name
,这种方法可以帮助你区分函数和其他标识符如原始类型数据或对象。
ECMAScript的属性和方法均使用驼峰式命名,尽管包含多个单词的属性名称并不多见(正则表达式对象的lastIndex
和ignoreCase
属性)。
其他命名风格
有时开发人员使用命名规范来弥补或代替语言特性的不足。
比如,JavaScript中无法定义常量(尽管有一些内置常量比如Number.MAX_VALUE
),所以开发者都采用了一种命名规范,对于那些程序运行周期内不会更改的变量使用全大写字母来命名。比如:
// 常量,请勿修改
var PI = 3.14,
MAX_WIDTH = 800;
除了使用大写字母的命名方式之外,还有另一种命名规范:全局变量全大写。这种命名方式和“减少全局变量”的约定相辅相成,并让全局变量很容易辨认。
除了常量和全局变量的命名规范,这里讨论另外一种命名规范,即私有变量的命名。尽管在JavaScript是可以实现真正的私有变量的,但开发人员更喜欢在私有成员或方法名之前加上下划线前缀,比如下面的例子:
var person = {
getName: function () {
return this._getFirst() + ' ' + this._getLast();
},
_getFirst: function () {
// ...
},
_getLast: function () {
// ...
}
};
在这个例子中,getName()
是一个公有方法,是确定的API的一部分,而_getFirst()
和_getLast()
则是私有方法。尽管这两个方法本质上和公有方法没有区别,但在方法名前加下划线前缀就是为了告知用户不要直接使用这两个私有方法,因为不能保证它们在下一个版本中还能正常工作。JSLint会对私有方法作检查,除非设置了JSLint的nomen
选项为false
。
下面介绍一些_private
风格写法的变种:
- 在名字尾部添加下划线以表明私有,比如
name_
和getElements_()
- 使用一个下划线前缀表明受保护的属性
_protected
,用两个下划线前缀表明私有属性__private
- 在Firefox中实现了一些非标准的内置属性,这些属性在开头和结束都有两个下划线,比如
__proto__
和__parent__