由於Javascript是個有「洞」的語言,因此試圖去理解別人寫的javascript程式碼,無疑是給自己找麻煩,而自己寫javascript若沒有採用好的模式,將來作維護時,也很容易就發生看不懂的狀況。因此,寫 javascript 之前,先了解可用的模式,是「初學者」必需要作的第一步。當然,直接看模式對初學者來說,會比較辛苦些,但至少看過一遍後,寫的程式比較有機會將來可以維護。以前作大型專案時,若前端用很多javascript,在作程式改版或維護時,至少80%就是打掉重寫! 跟 Java 比,javascript困難太多了。
由於該書的程式碼用長名稱,使得模式的「樣子」不易一眼看出來,所以將此書中的模式,用較短命名重寫,重點是方便一眼看出模式的樣子,實際命名時還是要注意使用常用的命名方式。
What is a Pattern? 什麼是模式
- Patterns are proven solutions 模式已驗證可提供解決方案
- Patterns can be easily reused 模式易於理解
- Patterns can be expressive 模式易於表達
The Constructor Pattern
// 1. Object Creation
var a = {};
var a = Object.create( Object.prototype );
var a = new Object();
// Object keys and values
// 2.1 dot
a.k = "v";
var value = a.k;
// 2.2 Square bracket
a["k"] = "v";
var value = a["k"];
// 2.3 Object.defineProperty
Object.defineProperty( a, "k", {
value: "v",
writable: true,
enumerable: true,
configurable: true
});
// 2.4 Object.defineProperties
Object.defineProperties( a, {
"k": { value: "v", writable: true },
"l": { value: "w", writable: false}
});
// 3 Basic Constructors
function A(i, j) {
this.i = i;
this.j = j;
this.total = function () { return this.i + this.j; };
this.max = function () { return Math.Max(this.i, this.j); };
}
// 4 Constructors With Prototypes
function A(i, j) {
this.i = i;
this.j = j;
}
A.prototype.total = function () { return this.i + this.j; };
A.prototype.max = function () { return Math.Max(this.i, this.j); };
The Module Pattern
// Object Literals
var a = {
k: "v",
f: function () { return k; }
};
// The Module Pattern
var a = (function () {
var k = "v";
function up() { k = k.toUpperCase(); }
return {
publicK: "value",
getK: function () { return k; },
setK: function (value) { k = value; },
getUpK: function () { up(); return k; }
};
})();
// Import mixins
var a = (function (b, c) {
var k = "v";
function up() { k = k.toUpperCase() + b + c; }
return {
publicK: "value",
getKBC: function () { return k + b + c; },
setK: function (value) { k = value; },
getUpK: function () { up(); return k; },
};
})(b ,c);
// Exports
var a = (function () {
var b = {};
var k = "v";
function up() { k = k.toUpperCase(); }
b.publicK = "value";
b.getK = function () { return k; };
b.setK = function (value) { k = value; };
b.getUpK = function () { up(); return k; }
return b;
})();
The Singleton Pattern
var singleton = (function () {
var instance;
function init() {
var k = "v";
function privateM(){ /* ... */ }
return {
publicK: "public",
publicM: function () { privateM(); }
};
};
return {
getInstance: function () {
if ( !instance ) { instance = init(); }
return instance;
}
};
})();
沒有留言:
張貼留言