2017-03-18 79 views
3

有人能告訴我是什麼樣的區別:什麼是JavaScript對象的差異「新」的關鍵字

function Customer(name, age) { 
    this.Name = name; 
    this.Age = age; 
} 

var cust1 = new Customer('Your Name', 20); 
var name1 = cust1.Name; 
var age1 = cust1.Age; 

和:

function Customer() { 
    return { 
     Name: 'Your Name', 
     Age: 20 
    } 
}; 

var cust2 = Customer(); 
var name2 = cust2.Name; 
var age2 = cust2.Age; 

它產生相同的輸出,畢竟,但是技師是不同的,我不知道爲什麼。

什麼是「新」的宗旨,在第一個,雖然我可能只是這樣做:

var cust1 = Customer('Your Name', 20); 
var name1 = cust1.Name; 
var age1 = cust1.Age; 
+6

嗯,沒有。 1是一個構造函數,而沒有。 2返回一個評估對象文字。嘗試'Object.getPrototypeOf(...)',你會發現一個區別。這個問題很有趣,值得一個很好的答案,因爲這兩種模式都可以用於不同的目的。 –

+0

對不起,我更新了我的帖子。 –

+1

這不是重複的 - 問題是關於構造函數與工廠函數,而不是構造函數與對象文字,並且現有問題的答案不能回答這個問題。 – Stuart

回答

3

首先使用構造,第二個工廠函數

構造函數是您用new關鍵字調用的函數。這樣做會爲您分配一個新對象,並使this成爲此新對象的引用,因此您可以輕鬆對它進行變異。構造函數基本上是語法糖,它模仿其他OOP語言構造來創建新對象。

工廠是簡單的函數,返回一個普通的對象。您負責自己分配新對象並將其返回。

結果是完全一樣的,因爲您不能使用instanceof與通過工廠函數創建的對象的區別。

兩者都有超越這個問題主題的優點和缺點:Constructors vs Factory Methods

0

的輸出是相等的(更小),但是代碼的行爲以兩種不同方式

在第一種情況的「功能」被用作構造爲新的js對象
以不同的方式在第二殼體'函數'只是返回一個對象。

沒有這兩種方法之間的真正區別,但首先是更多地使用和推薦的

的console.log()兩個結果:
構造:Customer { Name: 'Your Name', Age: 20 }
回報OBJ:{ Name: 'Your Name', Age: 20 }

+0

我認爲你的意思是顧客:{姓名:'你的名字',年齡:20}(帶冒號),不是嗎? –

+0

他們屬於不同的原型,第一個屬於'客戶'原型,而另一個對象屬於通用'{}'原型 –

+0

@JedMonsanto它輸出的原型和對象,沒有分號 –

相關問題