2012-10-27 34 views
2

這是可能的嗎?私人會員上有多個實例的原型

我們肯定知道如何來模擬私有成員在javascript:

var Class = (function() { 
    var _private; 

    Class = function() { 
     _private = {}; 
    }; 

    Class.prototype.set = function(name, value) { 
     _private[name] = value; 
    }; 

    Class.prototype.get = function(name) { 
     return _private[name]; 
    }; 

    return Class; 

})(); 

這種模式的副作用是,當我創建兩個實例:

var instanceOne = new Class(); 
var instanceTwo = new Class(); 

那麼私有財產之間共享:

instanceOne.set('test', 'me'); 
instanceTwo.get('test'); 

是否有解決此問題的一些方法?

問候

回答

3

的標準方法在JavaScript中有「私」的成員是在構造函數中使用局部變量,有什麼需要訪問他們在電話中給構造上下文定義爲關閉,像這:

function Class() { 
    var privateValue = 0; 

    this.getPrivateValue = function() { 
     return privateValue; 
    }; 
} 
Class.prototype.doSomething = function() { 
    // This function doesn't have access to `privateValue` 
    // except through `getPrivateValue`, even though 
    // it's accessible as a member of the instance 
}; 

這已被許多人描述,可能是最有名的Douglas Crockford

注意,這有反響是的Class每個實例得到getPrivateValue功能的它自己副本,因爲每一個都是封閉在一個不同的調用構造函數(這就是爲什麼它的工作原理)。 (這並不意味着所有的代碼的功能是相同的,但是,至少一些發動機  —谷歌的V8引擎,在Chrome中使用和其他地方例如  —允許相同代碼由多個功能共享對象有不同的關聯上下文)

(注意:我沒有使用名稱private,因爲它是一個保留字,在ES3中,它是一個「未來保留字」;在ES5中,它只有一個模式; details。)

我已經使用了一個簡單的變量而不是一個對象避免讓事情看起來比他們更復雜。這裏是將適用於您的示例的方式:

function Class() { 
    var privateData = {}; 

    this.get = function(name) { 
     return privateData[name]; 
    }; 

    this.set = function(name, value) { 
     privateData[name] = value; 
    }; 
} 

或者,如果你仍然想有跨實例共享類範圍的私人數據:

var Class = function() { 
    var dataSharedAmongstInstances; 

    function Class() { 
     var privateDataForEachInstance = {}; 

     this.get = function(name) { 
      return privateDataForEachInstance[name]; 
     }; 

     this.set = function(name, value) { 
      privateDataForEachInstance[name] = value; 
     }; 
    } 

    return Class; 
})(); 
+0

更常用的方法,也是使用python,是下劃線前綴。人們應該知道在構造函數中創建的函數不是靜態的,它們是爲每個實例創建的每個函數的唯一對象。 – Esailija

+0

@Esailija:下劃線前綴不會創建私有成員。 (我知道**你知道這一點,但對任何潛伏的人來說......)它會創建名字以下劃線開頭的公共成員,句號。 *將它們視爲私有是完全由代碼按照慣例做的事情,僅此而已。是的,很多人都這麼做。但是由於隱私沒有得到執行,人們會違反規則。事實上,我從來沒有使用過這個規則的重要代碼庫,在那裏有人*沒有*破壞它。但是這種說法有點欺騙,我只使用這個規則處理了幾個項目。 ;-) –

+0

好吧,這也不會創建私人成員,它們是變量。他們只被視爲成員,但你不能做任何與他們的東西,真正的對象屬性支持 – Esailija