模块能帮助我们清晰分离和组织项目中的代码单元。 在js中有几种实现模块的方法:
- 对象字面量表示法;
- Module模式
- AMD模块
- CommonJs模块
- ES Harmony模块
本篇中我们主要介绍“对象字面量”表示法。
2.1对象字面量
示例:
代码语言:javascript复制<script type="text/javascript">
var myObjectLiteral = {
varibaleKey : varibaleValue,
function: function () {
//实现
}
};
</script>
<!-- 注意
1.对象字面量不需要使用new实例化;
2.不能用在一个语句的开头,否则可能会被解释为一个块的开始;
-->
2.2 Module(模块)模式
JS中,Module模式用于进一步模拟类的概念。它能够使一个单独的对象拥有公有、私有方法和变量,从而屏蔽来自 全局作用域的特殊部分。进而降低了与其他脚本冲突的可能性。
其中,私有部分,主要利用了“闭包”。由于闭包的存在,声明的变量和方法只能在该模式内部可用。但在返回对象上 定义的变量和方法,外部使用者是能够调用的。
一个关于购物车的例子:
代码语言:javascript复制<script type="text/javascript">
var basketModule = (function() {
//私有
var baskey = [];
function doSomethingPrivate () {
//实现
}
function doSomethingElsePrivate() {
//实现
}
//返回一个暴露出的公有对象API
return {
//添加item到购物车
addItem: function (values) {
basket.push(values);
},
//获取购物车里的item数
getItemCount: function() {
return basket.length;
},
//私有函数的公有形式别名
doSomething: doSomethingPrivate,
//获取购物车里所有item的价格总值
getTotal: function() {
var itemCount = this.getItemCount(),
total = 0;
while (itemCount--) {
total = basket[itemCount].price;
}
return total;
}
}
})();
//交互
basketModule.addItem({
item: "bread",
price: 0.5
});
basketModule.addItem({
item: "酱油",
price: 1.5
});
//输出结果
console.log(basketModule.getItemCount());//2
console.log(basketModule.getTotal());//0.5 1.5 = 2
//注意
console.log(basketModule.basket);//underfined。因为basket没有暴露在公有的API中
</script>
优点:
- 整洁;
- 支持私有数据。在Module模式中,代码的公有部分能够接触到私有部分,而外部代码无法接触到类的私有部分。
缺点:
- 可见性需要改变时,需要修改每一处使用过该成员的地方;
- 无法访问之后在方法中添加的私有成员;
- 无法为私有成员创建自动化测试单元;