以下兩種情況有什麼不同?javascript函數對象和這個
案例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函數對象和這個
案例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
referes對象。
下面是與new
關鍵字調用構造函數時由JavaScript引擎執行的基本步驟:
this
集構造一個新的乾淨的對象。[[Prototype]]
屬性設置爲構造函數的prototype
(在某些實現中,該屬性可通過__proto__
獲得)。constructor
屬性作爲構造函數的引用(所以不是非標準的me.__proto__
,您可以通過me.constructor.prototype
訪問原型)。請注意,這是一個非常基本的解釋。還有很多其他的東西沒有包含在這裏,但是這應該給你它的要點。
在第一種情況下,您正在尋找函數本身的靜態屬性。
第二種情況是通過調用構造函數返回具有該屬性的對象的實例。它不是一個真正的範圍問題。
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
謝謝,您可以描述一下做在javascript '新' 呢。我閱讀http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/,但還不是很清楚。我可能需要再讀一遍。 – allenhwkim
@bighostkim - 您鏈接的文章是一篇非常好的文章,但並不直接回答您的問題。我在我的回答中添加了一個簡短的概要。 –