Javascriptでオブジェクトを作成するためのコンストラクターとリテラル表記の違いと類似点については、さまざまな答えがあるようです。最近、「オブジェクト リテラル表記法でオブジェクトを定義する場合、オブジェクト コンストラクターは実際には呼び出されない」ということを読みました(このステートメントは、配列を作成する場合にも当てはまります)。「new」キーワードは、コンストラクター表記を使用するときに初期化されたオブジェクトの「this」キーワードを設定するものであることを知っています。それで、リテラル表記でオブジェクトを作成するときに「this」キーワードは設定されませんか?それは、「オブジェクトコンストラクターが実際に呼び出されることは決してない」というときの上記の文の意味ですか?
1 に答える
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 Object
とobj instanceof Foo
は両方ともtrue
.
他にも違いはありますが、おそらくこの2つが最も顕著なものです。また、誤解していると思われる点を明確にしたいと思います。
「new」キーワードは、コンストラクター表記を使用するときに初期化されたオブジェクトの「this」キーワードを設定するものであることを知っています。
それは真実ではない。this
コンストラクター内から参照できるという事実にもかかわらず、の値this
は動的に決定されます (たとえば、メソッドを呼び出すとき)。MDN のドキュメント ページthis
を読んで理解を深めることをお勧めします。