2013-08-06 50 views
8

我是新來javascript中的對象。閱讀關於https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript的這個話題,並且有些困惑。2種方式的對象定義 - 有什麼區別?

我不明白功能和對象之間的區別。一方面,函數應該是函數的實例(它是Object的子元素),所以函數也應該是Object。

在另一方面對象本身被表示爲一個鍵 - 值對,如:

  1. var User = {name:"Tomy", password:"secret"}

    ,這是從一個函數定義在碼相容性方面相當不同..

    我可以用兩種不同的方式創建函數嗎?

  2. var User = function() {this.name="Tomy"; this.password="secret";}

+2

用b u能做到'無功TOMY =新用戶();' – DarkBee

+2

和目標是一個數據結構來保存...數據。一個函數是一個可重用的命令集合。您可以使用函數作爲*構造函數*來創建對象。對象文字和構造函數是創建對象的兩種方式,只有你必須顯式調用構造函數來創建對象。 –

+0

@DarkBee更準確地說,版本B有一個原型(在每個新實例上克隆的一組屬性),而A沒有。編輯:讓我覺得,如果你添加一個原型屬性到匿名對象,你可以使用新的A? – Virus721

回答

7

在此示例中,User現在包含一個對象。

var User = {name:"Tomy", password:"secret"} 
typeof User === "object" 
User.name === "Tomy" 

在本例中,User將包含一個函數。這個函數可以用來創建對象。

var User = function() {this.name="Tomy"; this.password="secret";} 
typeof User === "function" 
User.name === undefined 

然後,您可以創建儘可能多的用戶,只要你喜歡。

var user1 = new User(), user2 = new User(); 
user1.name === "Tomy" 

一個更現實的例子,會是這樣:

var User = function (name, pass) {this.name=name; this.password=pass;} 

var john = new User("John", "secret") 
var andrew = new User("Andrew", "passw0rd") 

john.password === "secret" 

一般構造(功能,使物體)比對象文本更靈活,允許方便和一致的創建對象(錯誤更容易發現,重複代碼更少)。

這兩種方法沒有跨瀏覽器不一致的情況。


要明白什麼new keyword是在「創造的時刻」真正發生的事,見What is the 'new' keyword in JavaScript?How does the new operator work in JavaScript?

+0

好的,關於對象的「創建時刻」的最後一個問題;-)。當我做var john = new User(「John」,「secret」)時,究竟發生了什麼?我的猜測是這樣的:1)創建新對象。 2)這與新創建的對象綁定在一起。 3)函數被調用。 (並且在調用this.something時創建數據成員)。我是否正確? – Novellizator

+0

@Novellizator,我在答案的最後添加了一個解釋。 – FakeRainBrigand

+0

@FakeRainBrigand:不,不會複製任何內容。新對象不等於'{}'(除非'User.prototype'爲'null')。請參閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new瞭解正確的步驟。 – Bergi

2

第一種創建具有兩個屬性的對象的實例。你可以像這樣訪問他們:

User.name; // Tomy 
User.password; // secret 

第二個創建一個對象,你可以創建單獨的實例,他們都會有自己的屬性的不同實例的定義。例如:

var a = new User(); 
a.name; // Tomy 
a.password; // secret 
var b = new User(); 
b.name = "Ralph"; 
a.name; // Tomy 
b.name; // Ralph 
1

這兩個不是等價的。第一個版本創建一個對象,設置屬性namepassword。第二個版本創建一個尚未執行的功能;在調用new User之前沒有設置屬性。

相關問題