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