2015-11-27 75 views
1

考慮對象:性能:原型私有方法

object = function() 
{ 
    var pub = { 
     m1: function() { 
     m2(); 
     m3(); 
     } 
    }; 

    function m2() { 
    ... 
    } 

    function m3() { 
    ... 
    } 

    return pub; 
} 

這個對象將被實例化一個以上的時間。我是否應該將私有函數添加到原型中,以免它們在每個實例中都被複制?

什麼可能是一個限制,也許是私人方法的數字X與實例的數字Y.

+1

你會如何在原型中實現一個私有函數? – Teemu

+0

我不會。我正在通過性能交易封裝。 – user1101

+1

您打算創建多少個實例? – nils

回答

-2

在使用ES5的OOP Javascript中,您的對象可以有3種類型的成員。

  • 公共
  • 私人
  • priviledged

公衆成員在原型創建,任何人都可以訪問。

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毫秒。

所以,隨意使用私人會員。

+0

謝謝你的基準測試!這讓我想知道JavaScript解釋器是否「緩存」了重複的私有成員/函數。 – user1101