2015-10-15 57 views
0

我正在寫廣泛使用的數據集的一種特殊形式的JavaScript應用程序,像性能JavaScript類定義VS對象

{ foo: 'foo', bar: 'bar', quz: { baz : 'baz' }} 

這是唯一的數據,但它嵌套的。沒有靜態數據。

我想爲該數據集創建一個模板以保持代碼清潔。我可以把一個模板對象的地方,並克隆了一個每次,像(使用jquery只爲例子)

var ds = jQuery.extend(true, {}, config.dataset); 

或者我可以創造一個「類」或函數原型,我可以

var ds = new Dataset(); 
調用

什麼表現最好?如果使用new構造函數,Class和函數定義是否有區別?

+0

在js – brk

+0

@ user2181397 wat裏沒有什麼叫class? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes – pawel

+0

@ user2181397除了那個合理的新增功能外,您還可以使用舊式功能做類似的事情。不是一個班,但你仍然可以'新建'它來創建一個實例。 – Jamiec

回答

0

有幾種方法可以做到這一點,不僅可以指定兩個,還可以使用純JS原型,比較所有三個時,看起來純js會是最快的。

幾件事情:

  1. 請注意,使用類是ES6它沒有被廣泛瀏覽器支持呢。
  2. 舊的「新」被稱爲原型繼承,如果你使用那個(我建議你這樣做,或者使用Object.create的新格式)要小心在類之間共享數據成員。
  3. 你也可以只克隆與JSON.parse(JSON.stringify(firstValueObject));
  4. 的對象。如果您選擇的Object.create(ES5),您可以定義默認值:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

http://jsperf.com/jquery-class-create-vs-pure-js-function/3

+1

*「舊」新「被稱爲原型繼承」*所以是新的。 –

+1

*「你也可以用JSON.parse(JSON.stringify(firstValueObject))來克隆對象;」*如果JSON不支持任何東西,比如Dates或其他各種對象,則不應該。 –

+0

看項目三.... –

0

的回答「什麼表現最好? 「,一般來說是:擔心它如果和當你實際上有性能問題。

答案「What perform best?」在JavaScript是:

  1. 看到一般的答案,

  2. 這取決於你的目標JavaScript引擎(瀏覽器等)

讓我們忽略性能測試,不過,看看你給的選擇。

實現一個DataSet「類」(構造函數和關聯原型,無論是新語法還是舊語法)都會非常複雜,並且對於您描述的用例幾乎沒有任何好處。你有一個嵌套的對象結構:

{ foo: 'foo', bar: 'bar', quz: { baz : 'baz' }} 

...等等,如果你使用的是作爲原型,這將是非常容易得到實例之間的串擾。例如:

// Demonstrating cross-talk 
 
function DataSet() { 
 
} 
 
DataSet.prototype = { foo: 'foo', bar: 'bar', quz: { baz : 'baz' }}; 
 

 
var d1 = new DataSet(); 
 
var d2 = new DataSet(); 
 
d1.quz.baz = "updated"; 
 
document.body.innerHTML = d2.quz.baz; // "updated" - huh?!

爲了避免這種情況,你必須作出建設quz屬性的副本:

function DataSet() { 
    this.quz = jQuery.extend(true, {}, this.quz); 
} 

然後,你必須要記住,做任何在原型中添加新的嵌套對象。

從你告訴我們,最簡單的解決方案就是使用你的第一個例子jQuery.extend

+0

實際上,我懷疑jQuery.extend是其中最慢的。 –

+1

@DoryZidon:同樣,這並不重要,在極少數情況下,答案是*測試*。另外,以什麼方式最慢?創建實例?理論上可能,並不是說這很重要。訪問屬性?在理論上,'extend'的結果將會更快,而不是它會很重要,因爲它不必通過原型鏈來查找屬性。 –

+0

的確的!我會陷入這個陷阱。 – commonpike

0

通過TJCrowder的答案在這裏的啓發,我想出了一個第三個選項

function newDataset(return { foo: 'foo', bar: 'bar', quz: { baz : 'baz' }}); 
var ds = newDataset(); 
  • 它集中的數據集,這是宗旨的定義
  • 它總是會創建一個新的對象,而不共享數據的風險 成員
  • 我可以隨時改變內部機制後和 基準,