给定对象:
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/