鉴于对象:
object = function ()
{
var pub = {
m1: function () {
m2();
m3();
}
};
function m2() {
...
}
function m3() {
...
}
return pub;
}
此对象将多次实例化。我应该将私有函数添加到原型中,因此不会在每个实例中复制它们吗?
对于X个私有方法与数量Y个实例,可能有什么限制。
答案 0 :(得分:-2)
在使用ES5的OOP Javascript中,您的对象可以有3种类型的成员。
公共成员在原型中创建,任何人都可以访问。
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毫秒。
所以,请随意使用私人会员。