2つの主な違いは、使用目的にあります。コンストラクターは、その名前が示すように、オブジェクトの複数のインスタンスを作成およびセットアップするように設計されています。一方、オブジェクトリテラルは、文字列や数値リテラルのように1回限りであり、構成オブジェクトまたはグローバルシングルトン(名前空間など)としてより頻繁に使用されます。
注意すべき最初の例については、いくつかの微妙な点があります。
コードが実行されると、無名関数が作成されてに割り当てられmyObj
ますが、それ以外は何も起こりません。明示的に呼び出されるまで存在methodOne
しmethodTwo
ません。呼び出される
方法に応じて、メソッドとはさまざまな場所に配置されます。myObj
myObj
methodOne
methodTwo
myObj()
:
コンテキストが指定されていないため、this
デフォルトwindow
のとメソッドはグローバルになります。
var app1 = new myObj()
:キーワード
によりnew
、新しいオブジェクトが作成され、デフォルトのコンテキストになります。this
は新しいオブジェクトを参照し、メソッドは新しいオブジェクトに割り当てられ、その後、新しいオブジェクトがに割り当てられapp1
ます。ただし、myObj.methodOne
未定義のままです。
myObj.call(yourApp)
:
これはmyを呼び出しますmyObj
が、コンテキストを別のオブジェクトに設定しますyourApp
。メソッドはに割り当てられ、同じ名前ののyourApp
プロパティをオーバーライドします。yourApp
これは、Javascriptで多重継承またはミックスインを可能にする非常に柔軟な方法です。
コンストラクターは、関数がクロージャーを提供するのに対し、オブジェクトリテラルは提供しないため、別のレベルの柔軟性も可能にします。たとえば、methodOneとmethodTwoがオブジェクトにプライベートな(コンストラクターの外部からアクセスできない)共通の変数パスワードに依存している場合、これは次のようにすることで非常に簡単に実現できます。
var myObj = function(){
var variableOne = "ABCD1234";
this.methodOne = function(){
// Do something with variableOne
console.log(variableOne);
};
this.methodTwo = function(){
// Do something else with variableOne
};
};
myObj();
alert(variableOne); // undefined
alert(myObj.variableOne); // undefined
variableOne
公開(公開)したい場合は、次のようにします。
var myObj = function(){
this.variableOne = "ABCD1234";
this.methodOne = function(){
// Do something with variableOne
console.log(this.variableOne);
};
this.methodTwo = function(){
// Do something else with variableOne
};
};
myObj();
alert(variableOne); // undefined
alert(myObj.variableOne); // ABCD1234