2つの主な違いは、使用目的にあります。コンストラクターは、その名前が示すように、オブジェクトの複数のインスタンスを作成およびセットアップするように設計されています。一方、オブジェクトリテラルは、文字列や数値リテラルのように1回限りであり、構成オブジェクトまたはグローバルシングルトン(名前空間など)としてより頻繁に使用されます。
注意すべき最初の例については、いくつかの微妙な点があります。
コードが実行されると、無名関数が作成されてに割り当てられmyObjますが、それ以外は何も起こりません。明示的に呼び出されるまで存在methodOneしmethodTwoません。呼び出される
方法に応じて、メソッドとはさまざまな場所に配置されます。myObj
myObjmethodOnemethodTwo
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