new
のようなキーワードでインスタンス化できるJavaScriptシングルトンを作成するこのかなり興味深い方法に出くわしましたvar x = new SingletonClass()
。可変スコープやクロージャなどはかなりよく理解していますが、このコードブロックがなぜそのように機能するのかを正確に理解するのに苦労しています。
// EDIT: DO NOT USE this code; see the answers below
function SingletonClass() {
this.instance = null;
var things = [];
function getInstance() {
if (!this.instance) {
this.instance = {
add: function(thing) {
things.push(thing);
},
list: function() {
console.log(things.toString());
}
};
}
return this.instance;
}
return getInstance();
}
var obj1 = new SingletonClass();
obj1.add("apple");
obj1.list(); //"apple"
var obj2 = new SingletonClass();
obj2.add("banana");
obj1.list(); //"apple,banana"
obj2.list(); //"apple,banana"
obj1.add("carrot");
obj1.list(); //"apple,banana,carrot"
obj2.list(); //"apple,banana,carrot"
SingletonClass
私の直感では、newがインスタンス化されるたびに、this
その新しい新しいオブジェクトを参照しますが、コンストラクターによって完全に別個のオブジェクトが返されるため、this
破棄されるだけだと思います。しかし、それはぶらぶらしています。どのように?なんで?
ここで私が見逃している小さな詳細がいくつかあります。誰かがそれに光を当てることができますか?
編集:このコードは悪いことがわかりました。インスタンスへの参照を「魔法のように」保持しているように見える理由は、実際にはインスタンスをグローバルオブジェクトにサイレントに格納しているためです。それはせいぜい悪い習慣であり、間違いなくバグが発生しやすいです。