2013-01-07 67 views
0

以下兩種情況有什麼不同?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 

只是想了解這個範圍如何作用於這兩種情況。

回答

6

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引擎執行的基本步驟:

  1. 電話與this集構造一個新的乾淨的對象。
  2. 將新對象的內部[[Prototype]]屬性設置爲構造函數的prototype(在某些實現中,該屬性可通過__proto__獲得)。
  3. 設置您的新對象的constructor屬性作爲構造函數的引用(所以不是非標準的me.__proto__,您可以通過me.constructor.prototype訪問原型)。
  4. 返回所述對象。

請注意,這是一個非常基本的解釋。還有很多其他的東西沒有包含在這裏,但是這應該給你它的要點。

+0

謝謝,您可以描述一下做在javascript '新' 呢。我閱讀http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/,但還不是很清楚。我可能需要再讀一遍。 – allenhwkim

+1

@bighostkim - 您鏈接的文章是一篇非常好的文章,但並不直接回答您的問題。我在我的回答中添加了一個簡短的概要。 –

1

在第一種情況下,您正在尋找函數本身的靜態屬性。

第二種情況是通過調用構造函數返回具有該屬性的對象的實例。它不是一個真正的範圍問題。

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