2013-10-07 87 views
1

我想了解Prototype函數和嵌套函數之間的區別。 我需要知道以下js jquery原型函數vs嵌套函數

  1. 哪個更好,性能明智
  2. 兩個
  3. 哪種結構更適合於哪些情況之間的主要區別(我假設雙方都不同的目的)是什麼?

我的基本用法: 我的基本用法是我想要寫一個Web應用程序AA主要功能啓動時,它會創建菜單,按鈕,按鈕點擊事件,繪製圖表,期間做桌子等應用程序導航,我需要我的代碼以更好更快的方式構建。我將使用jQuery和它的插件很多*

有關使用方法簡單,考慮我需要在5月的應用程序很多地方/階段創建組件/構件容器,我只想叫var port = App.creatPortlet()然後port.content(// place data)

請幫助。

性能: 我創建性能測試在這裏prototype-vs-nested-function,似乎函數原型更快。但我需要一些建議。

函數原型:

function Person(opt) { 
    this.firstName = opt.firstName; 
    this.lastName = opt.lastName; 
    } 

    Person.prototype.getFullName = function() { 
    return this.firstName + " " + this.lastName; 
    }; 
// Testing performance 
var P1 = new Person({ 
    firstName: 'Jeremy', 
    lastName: 'McPeak' 
}).getFullName(); 

嵌套函數:

var Person = function(opt) { 
    return { 
    getFullName: function() { 
     return opt.firstName + " " + opt.lastName; 
    } 
    }; 
} 
// Testing performance 
var P1 = new Person({ 
    firstName: 'Jeremy', 
    lastName: 'McPeak' 
}).getFullName(); 

UPDATE: http://jsperf.com/closure-prototype-static-reveal 我根據我的確切需要創建benchamrk。

回答

3

首先,對於這樣一小部分代碼,性能測試並不是很有用,因爲您不知道這是否會反映真實用例場景中的性能。 (可能會出現這樣的情況:您爲該小代碼測試JS引擎的優化器,例如內聯一些方法,或者您觸發JS引擎的優化過程,這會花費較長的時間進行初始化,但會在實時應用程序中帶來性能提升,你檢測到的測試庫的一個缺陷,....)

我敢打賭,你不考原型 VS 嵌套函數在這裏,但兩個賦值 VS 範圍處理

看着你的測試,你甚至不會測試這兩種情況。您只需測試案例二(在準備中,您將覆蓋使用var Person = ...;的名稱函數Person的訪問權限,因此function Person從未用於您的測試)。它應該看起來像這樣:updated jsperf.com
編輯看起來像你在我寫作時已經改變了自己)。

無論如何有什麼區別,什麼是更好的。那麼兩者都有有效的用例,並且由您決定什麼更好。

對象類型

對於第一個,通過Person創建的每個對象是同一類型的:

var p1 = new Person(); 
var p2 = new Person(); 

console.log(p1 instanceof Person); //true 
console.log(p2 instanceof Person); //true 

雖然與第二實施例的每個對象創建是Object類型。
因此,如果對象被傳遞給另一個函數,那麼你可以測試它是否爲Person類型,而對於第二個函數則不能。

雖然我更喜歡測試功能/功能的存在,而不是測試某種類型,但這對我來說沒有任何影響。

Prototype鏈

有時是有用的更新對於所有對象/擴展功能或修改/擴展現有功能的一種類型的所有對象。
雖然對於第一個例子這是可能的,但對於第二個例子來說是不可能的。

var Person = function() { 
}; 

var p1 = new Person(); 
Person.prototype.doSomething = function() {console.log("....");}; 

p1.doSomething(); 

的代碼

用可以重複使用的類似於給定一個對象的功能,第一個例子重用。你可以這樣做:

Person.prototype.doSomething.call(similarOBject, ...); 

在某些情況下,這可能很方便。這是一個經常使用的例子,Array函數數組像對象。

原始數據

有時是爲了保護一些原始數據有用的

保護讀取/直接修改。 這就是第二個例子的強度。雖然我個人認爲這應該由一個好的文檔處理,而不是通過代碼強制它,但它仍然是一個有效的用例。 在您的示例中,firstNamelastName對外部完全隱藏,但創建Person的代碼部分除外。

性能和速度

哪一個執行的速度和內存使用情況較好,主要取決於JS引擎。 不是每個引擎都會爲嵌套函數創建一個新函數,它很可能是正確檢測到的,並且只是在第二次調用時引用。創建範圍會產生一些開銷,但這可能可以忽略不計,具體取決於對象數量以及創建它們的頻率。

但正如已經說過的,你很可能在你的代碼中有其他東西會產生瓶頸。

在大多數使用prototype的情況下,在可維護性和可讀性方面是更好的選擇。

+0

我修改了上面的測試。原型似乎更快。 – django

+0

(1)。你能否基於這兩種情況的內存使用情況更新文章? (2)。我可以封裝原型的功能嗎?所以我保留人的模塊和它的變量私人?請舉例說明? – django

+1

@django您不僅測試_prototype_ vs _nested functions_,還_assignment_ vs _scope creation_。這就是爲什麼你的測試不是很有用,另一個是測試的方式並不能反映真實情況。 Js引擎有許多優化/分析步驟。無論如何,大多數圖書館都使用'prototype'來處理其大部分庫。這是_performance_測試的一個更好的指標。 –