封裝。 靜態語言依靠private, protected等方式實現封裝;javascript沒有這些機制。靠變量做用域來實現封裝。實例: 使用閉包實現變量的私有化、訪問的公有化javascript
define(function (require, exports, module) {
var classObj = (
function () {
var _env;
var setEnv = function (name) {
_env = name;
};
var getEnv = function () {
return _env;
};
return {
setEnv: setEnv,
getEnv: getEnv
}
}
)();
module.exports = classObj;
});
簡單單例 - html
var div = function (name) { this.instance =null; this.name = name; }; div.prototype.getName= function () { alert(this.name); } div.getSingle = function () { if(!this.instance) { this.instance = new div(); } return this.instance; };
// Main方法 $scope.testMethod = function () { var c = div.getSingle(); var d = div.getSingle(); alert(c==d); };
以上單例用戶使用時須要知道getSingle方法是爲了單例而設計的方法。如今實現一種透明單例java
透明代理算法
var div = (function () { var instance = null; var createDiv = function (html) { if(instance) return instance; this.html = html; this.init(); instance = this; return instance; }; createDiv.prototype.init = function () { var div = document.createElement('div'); div.innerHTML=this.html; document.body.appendChild(div); }; return createDiv; })(); $scope.testMethod = function () {
// 使用 New的方式 使用 單例 var c = new div('ab c'); var d = new div('12 3'); alert(c == d); };
改進版的透明代理, 構造函數即負責init有負責實例。 職責非單一 並且複用性差,使用代理的方式改進閉包
var div = (function () { var createDiv = function (html) { this.html = html; this.init(); }; createDiv.prototype.init = function () { var div = document.createElement('div'); div.innerHTML = this.html; document.body.appendChild(div); }; return createDiv; })(); var divProxy = (function () { var instance=null; return function (html) { if(instance) return instance; instance = new div(html); return instance; } })(); $scope.testMethod = function () { var c = new divProxy('ab c'); var d = new divProxy('12 3'); alert(c == d); };
策略模式指的是 定義一系列的算法,把他們封裝起來。 算法使用是在一個統一的Context中。app
var stratogyA= function () { }; stratogyA.prototype.getSalary = function (salary) { return salary*2; }; var stratogyB= function () { }; stratogyA.prototype.getSalary = function (salary) { return salary*3; }; var context = function (stratogy) { this.strategy=stratogy; }; context.prototype.calculateSalary= function (orgin) { return this.strategy.getSalary(orgin); }; $scope.testMethod = function () { var str = new stratogyA(); var c = new context(str); var l = c.calculateSalary(1000); alert(l); };