簡體   English   中英

性能:私有方法原型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM