[英]Performance: prototype private methods
給定對象:
object = function ()
{
var pub = {
m1: function () {
m2();
m3();
}
};
function m2() {
...
}
function m3() {
...
}
return pub;
}
該對象將實例化一次以上。 我是否應該將私有函數添加到原型中,以便不在每個實例中都復制它們?
私有方法的數量X實例的數量Y可能是一個限制。
在帶有ES5的OOP Javascript中,您的對象可以具有3種類型的成員。
公共成員是在原型中創建的,任何人都可以訪問。
var MyCustomClass = function() {
};
MyCustomClass.prototype.myPublicMethod = function() {
};
var myCustomObject = new MyCustomClass();
myCustomObject.myPublicMethod();
私有成員是在Class構造函數內部創建的,並且只能在class構造函數內部進行訪問(盡管位於同一Class中,但是您不能在公共方法中訪問它們)。
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
這樣,您可以通過調用特權的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 ms和ClassB 245 ms。
因此,隨時使用私人成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.