2012-03-25 80 views
1

這只是一個簡單的問題。無論哪種方式工作。我喜歡我的第一個例子,但我不知道做這種方式會導致更多的內存比第二個例子,因爲我們調用對象的「新」被分配....javascript:方法的獨立函數還是嵌入在對象中?

例1

var post = function(){ 
    var self = this; 
    self.div = $('<div></div>'); 
    self.color = function(color){ 
    this.div.css({background:color}); 
    } 
} 

var p = new post(); 
p.color("#FFF"); 

例2

var post = function(){ 
    self = this; 
    self.div = $('<div></div>'); 
} 

var color = function(p, color){ 
    p.div.css({background:color}); 
} 

var p = new post(); 
color(p, "#FFF"); 

所以,在第一個例子中,顏色的功能相信會得到重新每次一個新的職位被調用。如果我有100 new post();電話會怎麼樣?是否比示例2的效率低,其中函數只定義了一次?

這有道理我在問什麼?

回答

7

是的,在示例1中,對於「post」對象的每個實例都會有一個單獨的「color」函數實例,而在示例2中只有該函數的一個實例。很明顯,如果您計劃有大量的「後」對象實例,那麼你使用的內存比你需要的多。

在JavaScript中,使用您的兩個示例的最佳部分解決此問題的典型(或原型!)方式如下所示(請注意,我按照約定使用大寫「P」的「Post」的意圖用於使用與所述運營商new構造函數):

function Post() { 
    this.div = $('<div></div>'); 
} 

Post.prototype.color = function(color) { 
    this.div.css({background:color}); 
} 

var p = new Post(); 
p.color("#FFF"); 

當尋找一個對象的屬性(在我們的例子中,例如「p.color」),如果該屬性沒有定義直接那麼它會被查找爲構造該對象的函數(例如「Post.prototype.color」)的「prototype」的屬性。這也意味着您可以在原型上定義實例方法,並通過直接在各個實例屬性名稱上分配新函數來覆蓋它們(如果需要)。

這樣我們仍然可以獲得很好的面向對象的語法調用「p.color(...)」,並且只有一個函數方法實例的好處是所有「Post」實例共享。

+1

這是你的原型。很好的解釋和解決方案,+1。 – bernie 2012-03-25 15:16:28

+0

「Post」中如何有「原型」屬性?爲什麼我們不需要像Post.prototype = {};我們可以使用它之前? (沒有人這樣做,我只是想知道這是如何工作的) – 2012-03-25 15:17:44

+1

@Danny Milosavljevic:http://es5.github.com/#x13.2,第18步。 – pimvdb 2012-03-25 15:21:44

相關問題