如果接觸過其它語言的,應該會接觸過私人變數這一個概念。所謂私人就是沒有受保護,不能修改與訪問,只能通過你給的API介面訪問與修改。但是在JavaScript中並沒有私人變數這個概念,所有成員都可以通過下標訪問與修改,如:
私人變數
| 代碼如下 |
複製代碼 |
var F = function(){}; F.prototype.name = "zhangsan"; var a = new F(); alert( a.name ); // zhangsan a.name = "lisi"; alert( a.name ); // lisi |
在JavaScript裡,執行個體的成員變數就這樣輕而易舉被修改,設定delete。有不少這麼幹
| 代碼如下 |
複製代碼 |
var F = function(){}; // 變數前面加底線 F.prototype._name = "zhangsan"; var a = new F(); // 訪問跟正常訪問一樣 alert( a._name ); // zhangsan // 實際上也能輕而易舉被修改 a._name = "lisi"; alert( a._name ); // lisi |
加底線做位私人變數貌似很普遍,認可。但這僅是一種大家預設的公約,其實利用JavaScript特性,我們可以這樣定義私人變數:
| 代碼如下 |
複製代碼 |
(function(window){ // 定義私人變數預設值 var name = "zhangsan"; var F = function(){}; // 訪問私人變數 F.prototype.getName = function(){ return name; }; // 更新私人變數 F.prototype.setName = function(str){ name = str; }; window.F = F; })(window); var a = new F(); a.getName(); // zhangsan a.setName("lisi"); a.getName(); // lisi |
這種方式也是被使用最多最廣泛的方式。
私人靜態變數
| 代碼如下 |
複製代碼 |
<script language="javascript" type="text/javascript"> var JSClass = (function() { var privateStaticVariable = "nowamagic"; var privateStaticMethod = function() { alert("nowamagic"); }; return function() { this.test1 = function() { return privateStaticVariable; } this.test2 = function(obj) { privateStaticVariable = obj; } this.test3 = function() { privateStaticMethod(); } }; })(); var testObject1 = new JSClass(); var testObject2 = new JSClass(); alert(testObject1.test1()); testObject1.test2("change nowamagic"); alert(testObject2.test1()); testObject2.test3(); </script>
|
動態產生私人變數訪問器
| 代碼如下 |
複製代碼 |
//建立一個新的使用者物件,接受一個有許多屬性的對象作為參數 function User(properties) { //遍曆該對象的所有屬性,並保證其範圍正確 for(var i in properties){ (function(which){ var p=i; //建立此屬性的一個新的讀取器(getter) which["get"+p]=function(){ return properties[p]; }; //建立此屬性的一個新的設定器(setter) which["set"+p]=function(val) { properties[p]=val; }; })(this); } } //建立一個新的使用者物件執行個體,並把具有兩個屬性的一個對象傳入作為參數 var user=new User({name:"Bob",age:44}); //讀取屬性值 alert(user.getname()); //設定屬性值 user.setage(23); |