В JavaScript поля объекта всегда "общедоступны":
function Test() {
this.x_ = 15;
}
Test.prototype = {
getPublicX: function() {
return this.x_;
}
};
new Test().getPublicX(); // using the getter
new Test().x_; // bypassing the getter
но вы можете имитировать поле "private", используя локальную переменную и используя закрытие в качестве получателя:
function Test() {
var x = 15;
this.getPrivateX = function() {
return x;
};
}
new Test().getPrivateX(); // using the getter
// ... no way to access x directly: it a local variable out of scope
Одно из отличий заключается в том, что при "общедоступном" подходе каждый экземпляр getter является одним и тем же функциональным объектом:
console.assert(t1.getPublicX === t2.getPublicX);
тогда как при подходе "private" каждый экземпляр getter представляет собой отдельный объект функции:
console.assert(t1.getPrivateX != t2.getPrivateX);
Мне интересно об использовании этого подхода в памяти. Поскольку каждый экземпляр имеет отдельный getPrivateX
, это вызовет огромные издержки памяти, если я создам, скажем, 10k экземпляры?
Тест производительности при создании экземпляров классов с частными и открытыми членами: