次の 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
このスコープが両方のケースでどのように機能するかを理解したかっただけです。
次の 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
このスコープが両方のケースでどのように機能するかを理解したかっただけです。
JavaScript のすべての関数は、それ自体がオブジェクトです。そのため、設定されていない関数自体からプロパティをPerson.name
取得します。name
したがってundefined
。
これを私の設定で直接試すことができます:
Person.name = "John";
Person.name; // "John"
を介してコンストラクター内からプロパティを割り当てる場合
this.name = "Allen Kim";
そのインスタンスでプロパティを設定しています。次に、オブジェクトをインスタンス化すると、次のようになります。
var me = new Person();
作成中のオブジェクトを参照するため、コンストラクターは にname
プロパティを追加します。me
this
new
キーワードを使用してコンストラクター関数を呼び出すときに、JavaScript エンジンが実行する基本的な手順は次のとおりです。
this
新しいクリーンなオブジェクトに設定してコンストラクターを呼び出します。[[Prototype]]
新しいオブジェクトの内部プロパティをコンストラクタに設定しますprototype
(一部の実装では、 を介して利用可能になります__proto__
)。constructor
ます (したがって、非標準の の代わりに、me.__proto__
を介してプロトタイプにアクセスできますme.constructor.prototype
)。これは非常に基本的な説明であることに注意してください。ここに含まれていないものは他にもたくさんありますが、これで要点がわかります。
最初のケースでは、関数自体の静的プロパティを探しています。
コンストラクター関数を呼び出して、プロパティを持つオブジェクトのインスタンスを返す 2 番目のケース。それは実際には範囲の問題ではありません。
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