いくつかの小さな修正。JS では、これらは単なるクラスシミュレーションです。この言語には、実際のクラスの形式化された概念がありません。そして、あなたの JSON 表記は実際には JS オブジェクトです。これは、現在持っているように無効な JSON になります。
シングルトン パターンをシミュレートするためにオブジェクトを使用する必要はありません。次のようなコンストラクターでこれを行うことができます。
function Animal() {
if (Animal.instance) return Animal.instance;
Animal.instance = this;
/* constructor code here */
}
var animal_a = new Animal(); //constructor runs
var animal_b = new Animal(); //singleton instance returns
console.log(animal_a === animal_b); //true
また、最初のアプローチでは、インスタンスごとに個別に宣言するよりも、再利用可能で継承可能なコードをプロトタイプに配置する方が良いことに注意してください。これはより高速で、より賢明です - プロトタイプはそのための場所です。
function Animal() {}
Animal.prototype.method = function() {}
これにより、独自のプロパティと継承されたプロパティを区別するという問題も回避されます。これは、各インスタンスでメソッドを個別に宣言しているため、コードでは実行できませんでした。
[編集- プライベート メンバーに関する OP の質問への回答]
プライベート メンバーはローカル変数/関数として実装されます。つまり、現在のクロージャの外ではアクセスできません。
function Animal() {
var private_var = 'foo';
function private_method = function() { alert('bar'); };
}
パブリック メソッドは (選択した場合) それらを取得または設定できますが、それら自体がこれらのプライベート メンバーにアクセスできるようにするには、コンストラクターの外側ではなく、コンストラクターの内側で宣言する必要があります。
function Animal() {
var private_var = 'foo';
function private_method = function() { alert('bar'); };
if (!Animal.prototype.public_method)
Animal.prototype.public_method = function() {
alert(private_var);
};
}
var dog = new Animal();
dog.public_method(); //'foo'