给定对象:

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。

因此,请随时使用私人成员。

关于javascript - 性能:私有(private)方法原型(prototype),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33958472/

10-09 19:55
查看更多