JavaScript私人變數用法詳解

來源:互聯網
上載者:User

如果接觸過其它語言的,應該會接觸過私人變數這一個概念。所謂私人就是沒有受保護,不能修改與訪問,只能通過你給的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);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.