Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 性能:原型私有方法_Javascript_Performance_Prototype - Fatal编程技术网

Javascript 性能:原型私有方法

Javascript 性能:原型私有方法,javascript,performance,prototype,Javascript,Performance,Prototype,鉴于目标: object = function () { var pub = { m1: function () { m2(); m3(); } }; function m2() { ... } function m3() { ... } return pub; } 此对象将被实例化多次。我是否应该将私有函数添加到原型中,这样就不会在每个实例中复制它们 对于X个私有方法的

鉴于目标:

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();
私有成员是在类构造函数中创建的,只能在类构造函数中访问(尽管它们在同一个类中,但不能在公共方法中访问它们)

特权成员实际上是公共成员,但在构造函数中声明,因此它们可以使用私有成员

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个以上的privates成员和更多的privileged成员(~30),因为我不喜欢使用public成员(必须在两个不同的位置定义成员,构造函数和.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.DefinityProperty,因为我可能没有确切的语法


针对性能问题进行编辑

因此,我在我的浏览器(Chrome46)中运行了一些测试,私人成员和公共成员之间的性能没有受到影响

对于一个拥有12个私有成员的ClassA和一个拥有12个公共成员的ClassB,我已经实例化了每个类的1000000个对象,平均进行了10次测试,其中ClassA大约250毫秒,ClassB大约245毫秒


所以,请随意使用私有成员。

您将如何在原型中实现私有函数?我不会。我以性能来交易封装。您计划创建多少实例?鉴于您的工厂返回纯对象,您没有可以添加的原型。没有任何限制。只是成员越多,数量越大您创建的实例越多,内存就越丰富。感谢您的基准测试!这让我想知道javascript解释器是否“缓存”了重复的私有成员/函数。
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