1. 程式人生 > >JavaScript--Module模式

JavaScript--Module模式

comm ons order rop 松耦合 並且 模式 基本用法 重寫

//module: Module模式是JavaScript編程中一個非常通用的模式
window.onload = function() {
//1、基本使用:
var MyFn = function() {
var age = 24,sex = "boy";//私有變量
var action = function() {//私有行為
console.log("it man");
};
return {//暴露的公開成員
work : "orderMonkey",
action2 : function() {
console.log("it developer!");
}
}
};
var newMyFn = new MyFn();
console.log(newMyFn.action2());
console.log("===============================");
//基本用法的缺點:每次使用時都要使用new 關鍵字生成,這樣在內存中每次會copy一份,占用內存,使用閉包可以避免內存問題,實現自執行。也可以實現功能的擴展。

//2、模塊方法:
var MyFn2 = (function() {
var my = {};//向外返回的對象
var age = 25,name = "assassin";
var action = function() {
console.log("內部私有成員");
};
my.EnglishName = "wanghf";
my.action2 = function() {
console.log("major in JavaScript!");
};//公有代碼狀態
return my;
/*return my = {//向外返回的對象
work : "It developer",
action2 : function() {
console.log("外部成員變量");
}
}*/
})();
console.log(MyFn2.action2());//調用時避免生成,減小內存占有量
console.log("===============================");
//模塊方法全局變量的引入和jQuery設計思路一樣采用全局傳參
var MyFn3 = (function($) {
//同上
})(jQuery);
//3、模塊的擴展:
//對於大型項目測需要對自己的擴展了,基於上述的思想,同樣把自己作為參數傳值,進行擴展
var MyFn2 = (function(my) {//var不是必寫,為了統一。
my.addName = "intelwisd";
my.addAction3 = function() {
console.log("擴展的新方法...");
};
/*var my1 = {
addName : "intelwisd",
addAction3 : function() {
console.log("外部成員變量");
}
};*/ //對象的形式有對象的拷貝之前的會覆蓋以前的
return my;
})(MyFn2);
console.log(MyFn2.action2());
console.log("===============================");
//4、松耦合擴展和緊耦合擴展
//松耦合擴展 利用 var MyFn2 = MyFn2 || {};
var MyFn2 = (function(my) {
my.addName1 = "intelwisd1";
my.addAction4 = function() {
console.log("松耦合擴展的新方法...");
};
/*var my = {
addName: "intelwisd111",
addAction3: function () {
console.log("外部成員變量");
}
};*/
return my;
})(MyFn2 || {});
console.log(MyFn2.EnglishName);
console.log(MyFn2.addName1);
console.log(MyFn2.action2());
console.log(MyFn2.addAction4());
//松耦合的優點:確保該對象,在存在的時候直接用,不存在的時候直接賦值為{}
console.log("===============================");
//緊耦合擴展 可以實現重載的功能,但要確保加載順序
var MyFn2 = (function(my) {
var addAction4 = my.newAddAction4;
my.newAddAction4 = function() {//重載函數,以前的函數可以繼續使用
console.log("緊耦合擴展....");
};
return my;
})(MyFn2);
console.log(MyFn2.addAction4());
console.log(MyFn2.newAddAction4());
console.log("===============================");
//5、克隆與繼承 (在緊耦合的基礎上進行繼承,其實該對象的屬性對象或function根本沒有被復制,只是對同一個對象多了一種引用而已,所以如果老對象去改變它,那克隆以後的對象所擁有的屬性或function函數也會被改變。)
var MyFn2 = (function(my) {
var my1 = {}, key;
for (key in my) {
if (my.hasOwnProperty(key)) {
my1[key] = my[key];
}
}
var addAction4 = my1.newAddAction4;
my1.newAddAction4 = function() {//重載函數,以前的函數可以繼續使用
console.log("緊耦合擴展2....");
// 克隆以後,進行了重寫,當然也可以繼續調用以前的
};
return my1;
})(MyFn2);
console.log(MyFn2.addAction4());
console.log(MyFn2.newAddAction4());
console.log("===============================");
//6、跨文件中的私有成員的共享
var MyFn3 = (function (my) {
var _private = my._private = my._private || {},
_seal = my._seal = my._seal || function () {
delete my._private;
delete my._seal;
delete my._unseal;
},
_unseal = my._unseal = my._unseal || function () {
my._private = _private;
my._seal = _seal;
my._unseal = _unseal;
};
return my;
} (MyFn2 || {}));
//任何文件都可以對他們的局部變量_private設屬性,並且設置對其他的文件也立即生效。一旦這個模塊加載結束,應用會調用 blogModule._seal()"上鎖",這會阻止外部接入內部的_private。如果這個模塊需要再次增生,應用的生命周期內,任何文件都可以調用_unseal() ”開鎖”,然後再加載新文件。加載後再次調用 _seal()”上鎖”。
//子模塊共有的成員創建
MyFn2.CommentSubModule = (function () {
var my = {};
// ...

return my;
} ());
//eg:
MyFn3.CommentSubModule = (function () {
var my = {
name : "assassin",
Fn1 : function() {
alert(0);
}
};
// ...

return my;
} ());
}

學習來源Tom大叔javascript--Module

JavaScript--Module模式