2

Javascriptオブジェクトを作成するには、リテラルまたはコンストラクターの方法を使用できます。コンストラクターの方法で、私たちは言います。

function myObj(){
this.myProp1 = "abc";
this.myProp2 = "xyz";
}

文字通り、私たちは言います。

var myObj = {
myProp1:"abc",
myProp2:"xyz",
}

私の質問は、プロパティを宣言するときに、コンストラクターの方法で「this.myProp1」を使用し、文字通りの方法で「this」を使用しない理由のような違いがあるのはなぜですか?

4

2 に答える 2

12

2つの主な違いは、使用目的にあります。コンストラクターは、その名前が示すように、オブジェクトの複数のインスタンスを作成およびセットアップするように設計されています。一方、オブジェクトリテラルは、文字列や数値リテラルのように1回限りであり、構成オブジェクトまたはグローバルシングルトン(名前空間など)としてより頻繁に使用されます。

注意すべき最初の例については、いくつかの微妙な点があります。

コードが実行されると、無名関数が作成されてに割り当てられmyObjますが、それ以外は何も起こりません。明示的に呼び出されるまで存在methodOnemethodTwoません。呼び出される 方法に応じて、メソッドとはさまざまな場所に配置されます。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   
于 2013-02-22T19:01:16.137 に答える
4

文字通り何かを定義するとき、オブジェクトはコード内で直接構築されます。完成するまではまだ存在していません。その時点でthisは、意味がありません(それも必要ないというわけではありません)。

オブジェクト作成関数でこれを理解するには、まずthisJavaScriptで特別なことを理解してください。関数を呼び出すときはいつでも、あなたがなりたいものを何でも渡すことができますthis。一般に、イベントハンドラーのようなものは、イベントの原因となるDOMオブジェクトをとして渡しますthis。コードでは、これを次のように実行しますMyFunction.call(whatever_needs_to_be_this[, param0, param1]);。のような新しい演算子を使用するとvar mything = new SomeThing();、JavaScriptは基本的に次のようなことを行います。

var mything = {};
SomeThing.call(mything);

thisこの場合、あなたの職務に含まれることmythingになります。

于 2013-02-21T17:52:44.203 に答える