1. 程式人生 > >JS私有變數和靜態私有變數

JS私有變數和靜態私有變數

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;
}();