讓學習“上瘾”,成為更好的自己!!!
<!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>