多くのインスタンスを持つオブジェクトを作成したい。これら2つの方法でそれを行うことの違いは何ですか?
function anObject(foo,bar){
this.foo = bar;
yada yada
};
この
var anObject = function(foo, bar){
var foo;
var bar;
this.something = function...
}
多くのインスタンスを持つオブジェクトを作成したい。これら2つの方法でそれを行うことの違いは何ですか?
function anObject(foo,bar){
this.foo = bar;
yada yada
};
この
var anObject = function(foo, bar){
var foo;
var bar;
this.something = function...
}
多数のオブジェクトが予想される場合は、クロージャー パターン (2 番目の例) よりもオブジェクト コンストラクター パターン (最初の例) を強くお勧めします。コンストラクター パターンは、1 つのオブジェクト (foo プロパティを持つオブジェクト) のみを作成します。メソッドが必要な場合は、メソッドをコンストラクター プロトタイプに追加します。
anObject.prototype.something = function () {
// do something
}
コンストラクター パターンを使用すると、少なくとも 3 つのオブジェクトが割り当てられます。たとえば、
function anObject(foo, bar) {
this.something = function () {
// do something
};
}
これにより、密結合された 3 つのオブジェクトが作成されます。呼び出されたプロパティを含むオブジェクトを作成し、 が呼び出さsomething
れたときに作成された新しい関数オブジェクトを格納し、3 番目に、とanObject
を含む関数環境を作成します。このフォームには、保持され、他のものからアクセスできないという利点があります。foo
bar
foo
bar
something
ただし、2 つの追加の割り当てが必要であり、コンストラクター パターンよりも約 3 倍のコストがかかりますが、最新のエンジンの最適化により、マイレージは異なる場合があります。関数を追加すると割り当てが悪化し、関数ごとに割り当てが 1 つ追加されます。コンストラクター パターンを使用すると、メソッドの割り当てはプロトタイプ チェーンを介して各オブジェクトで共有され、メモリ効率が大幅に向上します。