2013-12-14 95 views
0

在閱讀學習JavaScript第2版時,我在第13章:創建自定義JavaScript對象中看到一段代碼。JavaScript新功能混淆

var oneOff = new Function() { 
    this.variablea = "variablea"; 
    this.method = function() { 
     return xxx; 
    } 
} 

有人說,這是一樣的:

var oneOff = new Object(); 
oneOff.variablea = "variablea"; 
oneOff.method = function() {...}; 

但我不知道有什麼新功能(){..}是。任何幫助表示讚賞。謝謝。

+1

查看[** MDN **](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function)? – adeneo

+0

這個用法與MDN –

+0

上提到的「新函數([arg1 [,arg2 [,... argN]],functionBody)」不一樣,我認爲你誤讀了這個例子,因爲你的問題陳述完全錯了。第一段代碼是語法錯誤,您可以通過在瀏覽器控制檯中輸入來進行驗證。 – Pointy

回答

1

new function(通知F是小寫)是在Javascript中創建對象的衆多方法之一。在解釋代碼後,對象將被分配到oneOff,其中variableamethod屬性。

另一種方式來實現這一目標是使用對象的文字符號:

var oneOff = { 
    variablea:"variablea", 
    method:function() { 
     return xxx; //this will be undefined 
    } 
} 

這工作得很好,如果你只需要oneOff一個實例但是如果你需要的oneOff多個實例可以使用函數構造函數如下所示:

function OneOff(){ 
    this.variablea = "variablea"; 
} 

OneOff.prototype.method = function(){ 
    return xxx; //one again undefined 
} 

var firstOneOff = new OneOff(); 
var secondOneOff = new OneOff(); 
+0

任何人都想解釋downvotes?有興趣瞭解我在哪一個關閉這個。 –

+0

我給了upvote。你提出的方法確實是典型的用法。我總是重視函數聲明和函數文字,因爲他們對我所做的事很清楚。 –

+0

@WaiKitKung感謝您的支持,希望這對我有所幫助。我一直很想聽到那些倒下的人的意見。如果這是一個合法的downvote,他們解釋他們的推理,你從SO中獲得最大的價值。 –

2

使用新函數(){/ * * /}時,您不是創建一個新函數,而是創建一個對象。
這僅僅是一個標準使用的新一個構造函數,像:

var oneInstance = new ConstructorFunction(); 

function ConstructorFunction() { 
     this.var1 = 'val1'; 
     this.method1 = function() { } ; 
} 

不同的是,該構造是正確的,在實例化時定義,我們省略調用的函數,這是合法(雖然我認爲令人困惑)。

,我覺得它在某種程度上與一些支架清晰,明確保證調用構造函數:

var oneOff = new (function() { 
    this.variablea = "variablea"; 
    this.method = function() { 
    return xxx; 
    }; 
})() ; 

但只創建一個單獨的對象,一個寧可使用簡單對象符號:

var oneOff = { 
    variablea : 'valuea', 
    method : function() { return xxx; } 
} 

它們在表演中的表現如何?

對於新的函數(){}方法,創建對象需要首先創建一個函數,然後在「新建」上下文中執行該函數。另一方面,對象只是創建一個對象,所以它創建的時間少,垃圾少。

關於兩種類型對象(讀/寫屬性/使用方法的時間)的使用性能,很難說,因爲所有的JavaScript解釋器都非常複雜和非常不同。在基準測試之前,他們何時以及如何決定優化部分代碼是您無法真正瞭解的。 - 基準測試也不是一件容易的事,因爲這些「隨機」優化。我敢打賭,他們應該是非常接近的使用表現,讓我們知道,如果你花時間做一些措施。

+0

添加的括號對我來說很清楚。我知道last()是可選的。就性能和編譯器解釋而言,它與對象字面量相同嗎? –

+0

我編輯回答。 – GameAlchemist