「なぜこれがxではなくyとしてコンソールに記録されるのですか...」
それがJavaScriptの仕組みだからです。値は、this
メソッドが呼び出されたオブジェクトとして設定されます。通常、オブジェクトは。から遠ざける必要があります.prototype
。これらは、コンストラクターを使用して作成されたすべてのインスタンス間で共有されます。
「...そして、yがコンストラクターのないリテラルオブジェクトであるとすると、どうしてそれが可能になるのでしょうか?」
それは簡単です。値はthis
コンストラクターに関連付けられていません。これは、関数またはメソッドの呼び出し方法に基づいて設定される動的な値です。
this
呼び出しで設定された自然値を手動でオーバーライドできるユーティリティがあります。の.call
または.apply
メソッドを使用してメソッドFunction.prototype
を呼び出すことは一例です
var foo = new x();
foo.y.z.call(foo);
に最初の引数として渡すことで手動で設定したためthis
、z
メソッドにはオブジェクトが含まれます。foo
.call
この.call
メソッドは、メソッドのメソッドとして呼び出されたことを認識しているz
ため、自動的に呼び出しますが、最初の引数として指定した値に値をz
設定します...この場合はオブジェクトです。this
z
foo
ただし、通常、オブジェクトをの値として使用することはありません.prototype
。その理由は、コンストラクターから作成されたすべてのインスタンスがコンストラクターのの暗黙の参照を取得するため、.prototype
のプロパティのオブジェクトへの更新が.prototype
すべてのインスタンスから監視されるためです。