性能:原型私有方法

时间:2015-11-27 13:28:00

标签: javascript performance prototype

鉴于对象:

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

   function m2() {
     ...
   }

   function m3() {
     ...
   }

   return pub;
}

此对象将多次实例化。我应该将私有函数添加到原型中,因此不会在每个实例中复制它们吗?

对于X个私有方法与数量Y个实例,可能有什么限制。

1 个答案:

答案 0 :(得分:-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

这允许您通过调用特权GETTER来访问公共方法中的私有成员。

现在,关于表现。我目前在一个项目中使用这种模式,有超过700个对象,其中有超过12个私有成员和更多特权成员(~30)因为我不喜欢使用公共成员(必须定义2个不同的成员) places,构造函数和.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,我已经实例化了每个类的1,000,000个对象,对于ClassA平均为10个测试,对于ClassB平均为245毫秒。

所以,请随意使用私人会员。