コードにはいくつかの問題があります。
function Foo() {
this.Bar = Bar;
// etc..
}
var Bar = {
__words : {},
addWord : function (word, amount) {
this.__words[word] = amount;
}
// etc..
}
Bar は Foo の前に定義する必要がありますが、変数は実際には関数スコープ レベルで定義されているため、この特定の例では問題にならない可能性があるため、問題なく機能する可能性があります。
つまり、Foo コンストラクター内でオブジェクトをコピーしています。オブジェクトは可変であるため、機能しません。オブジェクトへの 1 つの変更により、もう 1 つの変更が行われます。あなたができるかもしれないことはこれです。new なしでそれを行う別の方法を次に示します。
var Bar = {
create: function () {
var obj = Object.create(this);
obj.__words= {};
return obj;
},
addWord: function (word, amount) {
this.__words[word] = amount;
}
...other methods...
};
var Foo = function () {
this.Bar = Bar.create();
// etc..
};
Object.create
しかし、他のブラウザでどのようにサポートされているかわかりません。この構文は Felix が書いたものと同等であり、2 つのオブジェクトの必要性を明確に取り除くことができます。
唯一の大きな違いは、代わりに new Bar() を記述することです。実際にプロトタイプ オブジェクトを作成し、プロトタイプからオブジェクトを作成しています。create はコンストラクターです。
Foo も同じように書くことができ、次のようになります。
var Bar = {
create: function () {
var obj = Object.create(this);
obj.__words= {};
return obj;
},
addWord: function (word, amount) {
this.__words[word] = amount;
},
...other methods...
};
var Foo = {
create: function () {
var foo = Object.create(this);
foo.Bar = Bar.create();
return foo;
},
....
};
var foo1 = Foo.create();
var foo2 = Foo.create();
foo1.bar.addWord("allo", 3);
それはすべて、あなたが何をしようとしているのかに依存すると思いますが、「新しい」演算子よりもいくつかの利点として create メソッドがあります。たとえば、オブジェクトの作成後にコールバックを実行する非同期メソッドを作成できます。
詳細については、こちらをご覧ください。結局のところ、それはほとんど同じことです。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create