3

Javascriptでオブジェクトを作成するためのコンストラクターとリテラル表記の違いと類似点については、さまざまな答えがあるようです。最近、「オブジェクト リテラル表記法でオブジェクトを定義する場合、オブジェクト コンストラクターは実際には呼び出されない」ということを読みました(このステートメントは、配列を作成する場合にも当てはまります)。「new」キーワードは、コンストラクター表記を使用するときに初期化されたオブジェクトの「this」キーワードを設定するものであることを知っています。それで、リテラル表記でオブジェクトを作成するときに「this」キーワードは設定されませんか?それは、「オブジェクトコンストラクターが実際に呼び出されることは決してない」というときの上記の文の意味ですか?

4

1 に答える 1

3

this値は、オブジェクト リテラルが作成された直後にオブジェクト内で使用できます(ただし、常にコンテキストに依存します)。例を挙げて説明することをお勧めします:

var obj = {
    foo : true,
    // bar : this.foo, // THIS WOULD FAIL, this IS NOT AVAILABLE YET!
    baz : function() { 
       return this; // THIS IS OK, this WILL BE AVAILABLE 
                    // WHEN THE FUNCTION IS *CALLED*
    }
};

obj === obj.baz(); // true

あなたが引用した文について:

オブジェクトリテラル表記でオブジェクトを定義する場合、Object コンストラクターが実際に呼び出されることはありません

それは正確ではありません。舞台裏では、Objectコンストラクター呼び出されます (または、少なくともそうであるかのように動作します)。文が言及しているのは、次の違いだと思います。

var obj = { foo : true };

この:

function Foo() {
    this.foo = true;
}
var obj = new Foo();

どちらのバージョンも、非常によく似た (ただし同一ではない) オブジェクトを生成します。相違点の一部を次に示します。

  • コンストラクター バージョンでは、オブジェクトの作成と同時に追加のコード (関数の呼び出しなど) を実行できます (コンストラクターから何らかの関数を呼び出すだけです)。

  • リテラル バージョンでは、obj instanceof Object === true. コンストラクタ バージョンでは、obj instanceof Objectobj instanceof Fooは両方ともtrue.

他にも違いはありますが、おそらくこの2つが最も顕著なものです。また、誤解していると思われる点を明確にしたいと思います。

「new」キーワードは、コンストラクター表記を使用するときに初期化されたオブジェクトの「this」キーワードを設定するものであることを知っています。

それは真実ではない。thisコンストラクター内から参照できるという事実にもかかわらず、の値thisは動的に決定されます (たとえば、メソッドを呼び出すとき)。MDN のドキュメント ページthisを読んで理解を深めることをお勧めします。

于 2013-02-01T19:39:33.830 に答える