让学习“上瘾”,成为更好的自己!!!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>模块模式和增强的模块模式</title>
</head>
<body>
<script>
// 1 , 模块模式
/*
前面两种模式是用于为自定义类型创建私有变量和特权方法的
模块模式 --> 为单例创建私有变量和特权方法
单例:只有一个实例的对象(若创建构造函数,则程序中只有一个该构造函数的实例), JavaScript用对象字面量的方式来创建单例对象
var
*/
// 单例对象
var singleton = {
name: value,
method: function () {
// do something
}
};
// 模块模式通过为单例添加私有变量和特权方法能够使单例得到增强
// 语法如下:
var singleton = function () {
// 私有变量和私有函数
var privateValue = 10;
function privateFunction() {
return false;
}
// 公有方法
// 返回的对象是在匿名函数内部定义的,因此他的公有方法有权访问私有变量和函数
// 本质上讲,这个对象字面量定义的是单例的公共接口!
return {
publicProperty: true,
publicMethod: function () {
privateValue++;
return privateFunction();
}
};
}();
// 模块模式在需要对单例进行某些初始化,同时又要维护其私有变量时非常有用
// 如下:
var application = function () {
// 私有变量和私有函数
var components = new Array();
// 初始化
components.push(new BaseComponent());
return {
getComponentCount: function () {
return components.length;
},
registerComponent: function (component) {
if (typeof component === 'object') {
components.push(component);
}
}
};
}();
// 简言之,如果必须创建一个对象并以某些数据对其进行初始化,同时还要公开一些能够访问这些私有数据的方法,那么就可以用“模块模式”
// 以这种模式创建的每一个单例都是Object的实例, 而且单例通常都是作为全局对象而存在的
// 2, 增强的模块模式
// 进一步改造:在返回对象之前加入对其增强的代码
// 增强的模块模式 --> 适合那些单例必须是某种类型的实例,同时还必须添加某些属性和方法对其加以增强的情况
var singleton = function () {
// 私有变量和私有函数
var privateValue = 10;
function privateFunction() {
return false;
}
// 创建对象
var object = new CustomType();
// 添加特权属性和方法
object.publicProperty = 10;
object.publicMethod = function(){
privateValue++;
return privateFunction();
};
// 返回这个对象
return object;
}();
// 如果前面演示的模块模式的例子中的application对象必须是BaseComponent的实例,则:
var application = function () {
// 私有变量和私有函数
var components = new Array();
// 初始化
components.push(new BaseComponent());
// 构建一个application的一个局部副本
var app = new BaseComponent();
// 公共接口
app.getComponentCount = function(){
return components.length;
};
app.registerComponent = function(){
if (typeof component === 'object') {
components.push(component);
}
};
// 返回这个副本
return app;
}();
// 可以使用构造函数模式、原型模式来实现自定义类型的特权方法
// 也可以使用模块模式、增强的模块模式来实现单例的特权方法
</script>
</body>
</html>