0

次の 2 つの場合の違いは何ですか?

ケース1

var Person = function() { this.name="Allen Kim" }
Person.name; //undefined

ケース 2

var Person = function() { this.name="Allen Kim" }
var me = new Person();
me.name // Allen Kim

このスコープが両方のケースでどのように機能するかを理解したかっただけです。

4

3 に答える 3

6

JavaScript のすべての関数は、それ自体がオブジェクトです。そのため、設定されていない関数自体からプロパティをPerson.name取得します。nameしたがってundefined

これを私の設定で直接試すことができます:

Person.name = "John";
Person.name; // "John"

を介してコンストラクター内からプロパティを割り当てる場合

this.name = "Allen Kim";

そのインスタンスでプロパティを設定しています。次に、オブジェクトをインスタンス化すると、次のようになります。

var me = new Person();

作成中のオブジェクトを参照するため、コンストラクターは にnameプロパティを追加します。methis


newキーワードを使用してコンストラクター関数を呼び出すときに、JavaScript エンジンが実行する基本的な手順は次のとおりです。

  1. this新しいクリーンなオブジェクトに設定してコンストラクターを呼び出します。
  2. [[Prototype]]新しいオブジェクトの内部プロパティをコンストラクタに設定しますprototype(一部の実装では、 を介して利用可能になります__proto__)。
  3. 新しいオブジェクトのプロパティをコンストラクター関数への参照として設定しconstructorます (したがって、非標準の の代わりに、me.__proto__を介してプロトタイプにアクセスできますme.constructor.prototype)。
  4. 上記のオブジェクトを返します。

これは非常に基本的な説明であることに注意してください。ここに含まれていないものは他にもたくさんありますが、これで要点がわかります。

于 2013-01-07T19:36:10.757 に答える
1

最初のケースでは、関数自体の静的プロパティを探しています。

コンストラクター関数を呼び出して、プロパティを持つオブジェクトのインスタンスを返す 2 番目のケース。それは実際には範囲の問題ではありません。

于 2013-01-07T19:36:28.003 に答える
1
var Person = function() { this.name="Allen Kim" }
Person.name; //undefined due to the fact that there is no Person object.

var Person = function() { this.name="Allen Kim" }
var me = new Person();
me.name // Allen Kim --> Person `me`'s name
于 2013-01-07T19:36:45.310 に答える