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
ただし、ローカル変数を使用し、クロージャーをゲッターとして使用することで、「プライベート」フィールドをシミュレートできます。
function Test() {
var x = 15;
this.getPrivateX = function() {
return x;
};
}
new Test().getPrivateX(); // using the getter
// ... no way to access x directly: it's a local variable out of scope
1 つの違いは、「パブリック」アプローチでは、各インスタンスのゲッターが同じ関数オブジェクトであることです。
console.assert(t1.getPublicX === t2.getPublicX);
一方、「プライベート」アプローチでは、各インスタンスのゲッターは個別の関数オブジェクトです。
console.assert(t1.getPrivateX != t2.getPrivateX);
このアプローチのメモリ使用量に興味があります。各インスタンスには個別getPrivateX
の があるため、たとえば 10,000 個のインスタンスを作成すると、メモリのオーバーヘッドが大きくなりますか?
プライベート メンバーとパブリック メンバーを持つクラスのインスタンスを作成するパフォーマンス テスト: