在使用ES5的OOP Javascript中,您的對象可以有3種類型的成員。
公衆成員在原型創建,任何人都可以訪問。
var MyCustomClass = function() {
};
MyCustomClass.prototype.myPublicMethod = function() {
};
var myCustomObject = new MyCustomClass();
myCustomObject.myPublicMethod();
私有成員在類的構造函數內部創建的,只能在類的構造函數中(,你不能訪問它們的公共方法,儘管在同一個班是)進行訪問。
var MyCustomClass = function() {
var m_privateMember; //cannot be accessed outside the constructor
};
特權成員實際上是公共成員,但在構造函數中聲明,因此他們可以使用私有成員。
var MyCustomClass = function() {
var m_privateMember = 2;
//Priviledged method (which is a GETTER here)
this.GetPrivateMember = function() {
return m_privateMember;
};
};
var myCustomObject = new MyCustomClass();
console.log(myCustomObject.GetPrivateMember()); //2
允許您通過調用priviledged的GETTER訪問公共方法中的私有成員。
現在,關於表現。我目前在一個有超過700個對象的項目中使用這種模式,其中有12個以上的私有成員和更多的特權成員(〜30),因爲我不喜歡使用公共成員(必須定義2個不同的成員地方,構造函數和.prototype,所以我只是在構造函數中定義它們,並在構造函數結尾處調用'initialize'方法)。我沒有注意到任何性能問題。對象仍然以儘可能快的速度實例化。我不能保證沒有性能成本,但恕我直言,這是不明顯的。
您也可以定義屬性是這樣的:
var MyCustomClass = function() {
var myPrivateMember;
Object.defineProperty(MyCustomClass.prototype, 'myProperty', {
get: function() {
return myPrivateMember;
},
set: function(_param) {
myPrivateMember = _param;
}
});
}
var myObject= new MyCustomClass();
myObject.myProperty = 6;
myObject.myProperty; //6
但我不喜歡它,因爲我更喜歡叫GetMyProperty(),但其口味的問題。
你應該檢查Object.definyProperty,因爲我可能沒有確切的語法。
編輯性能問題。
因此,我在瀏覽器(Chrome 46)中運行了一些測試,私有成員和公共成員之間沒有性能衝擊。
對於具有12個私人成員的ClassA與具有12個公共成員的ClassB,我已經實例化了每個Class的1,000,000個對象,對於ClassA平均進行10次測試,大約250毫秒,ClassB爲245毫秒。
所以,隨意使用私人會員。
你會如何在原型中實現一個私有函數? – Teemu
我不會。我正在通過性能交易封裝。 – user1101
您打算創建多少個實例? – nils