JS私有變數和靜態私有變數
阿新 • • 發佈:2018-11-07
1.私有變數
function myObject() {
var privateVariable = 10;
function privateFun() {
return false;
}
this.publicMethod = function() {
privateVariable++;
return privateFun();
};
}
function Person(name) {
this.getName = function() {
return name;
};
this .setName = function(value) {
name = value;
};
}
var p = new Person("Kitty");
p.getName();
p.setName("haha");
p.getName();
缺點:僅僅使用建構函式,導致多個例項,對應多個方法,方法不能重用,從而用靜態私有變數進行改進
2.靜態私有變數
(function() {
var privateVariable = 10;
function privateFun() {
return false;
}
// 建構函式
myObject = function() {
};
myObject.prototype.publicMethod = function() {
privateVariable++;
return privateFun();
}
})();
(function() {
var name = "";
Person = function(value) {
name = value;
};
Person.prototype.setName = function(value) {
name = value;
}
Person.prototype.getName = function () {
return name;
}
})();
// 在這個例子中,Person建構函式與getName()和setName()方法一樣,都有權訪問私有變數name,在這種模式下,變數name就變成了一個靜態的、由所有例項共享的屬性
以這種方式建立靜態私有變數會因為使用原型而增進程式碼服用,但每個例項都沒有自己的私有變數。到底是使用例項變數,還是靜態私有變數,最終還要視具體需求而定;
3.模組模式: 為單例建立私有變數和特權方法(即訪問私有變數的方法) 單例:只有一個例項物件,JS中的單例用物件字面量來表示
var singleton = function() {
var privateVariable = 10;
function privateFun() {
return false;
}
return { // 返回的物件字面量中只包含可以公開的屬性和方法
publicProperty: privateVariable,
publicMethod: function() {
privateVariable++;
return privateFun();
}
};
}();
singleton
這種模式在需要對單例進行某些初始化,同時又需要維護其私有變數時是非常有用的
4.增強模組模式:模組例項+單例必須是某種型別的例項
var singleton = function() {
var privateVariable = 10;
function privateFun() {
return false;
}
// 建立物件
var object = new customType(); // customType為一個物件型別, 暫且用new Object()代替
object.publicProperty = privateVariable;
object.publicMethod = function() {
privateVariable++;
return privateFun();
};
return object;
}();