2011-11-23 67 views
1

我最近一直在玩javascript,我試圖去掌握僞古典繼承的優點(如Crockford使用對象的原型屬性所述)。克羅克福德說,他很少使用它,喜歡功能的方法,那就是創建一個像增強Javascript僞古典繼承vs功能繼承

var obj = function() { 
    var self = {}; 
    self.method = function() { 
    }; 
    return self; 
} 

我更喜歡這種方法,它更容易的目的是瞭解和靈活的,似乎功能。然而,我看到很多仍然使用prototype屬性的代碼,包括像jQuery這樣的流行框架。我想知道有什麼優勢?我對使用prototype屬性的理解是,它使我們能夠通過遍歷原型鏈來詢問對象是否是特定類型。然而,作爲一種動態的語言,問問一個對象是否可以做某件事情,而不是它是什麼?

+1

看看這裏關於速度,http://blogs.msdn.com/b/kristoffer/archive/2007/02/13/javascript-prototype-versus-closure-execution-speed.aspx和allso檢查javascript原型繼承 –

回答

1

人們使用原型,因爲它是一個繼承構造。

如果你想從另一個對象繼承方法和屬性,那麼你使用原型。

var Proto = { 
    method: function() { } 
} 

var obj = function() { 
    return Object.create(Proto); 
} 
+0

這不是*唯一的方式*。你也可以使用串聯。獎金,你可以混合使用任意數量的原型:obj = function(){return _.extend({},proto,Backbone.Events); }; –

1

我認爲兩個比較重要的方面是速度和內存使用率。如果您的構造函數創建了所有這些方法的新實例,則這會減慢代碼速度,並可能導致其外部作用域(構造函數)被保留,從而導致更多的RAM使用。

證明:http://jsperf.com/in-constr-vs-on-proto - 至少在chrome中,它在構造函數中執行速度慢了89%。

+0

我明白了,所以通過使用原型,您只能定義一次繼承,從而使用函數方法在每個實例化上定義繼承? – stantona

4

我看到使用prototype代替這種方法的好處是效率。每個以「經典」方式完成的對象實例(使用prototype)將共享方法,而功能方法將爲每個方法創建新方法。

+3

更不用說繼承了。 –

3

是的,它通常是「最好問一個對象是否可以做某件事,而不是它是什麼」(有時稱爲「鴨子打字」,因爲如果一個物體看起來像鴨子,鴨子就像鴨子一樣。 )。然而,有時候,你真的想知道一個對象是否是一個數組,而不僅僅是一個具有length屬性的對象。

但是,原型或僞​​古典方法在創建大量對象時也具有性能優勢。

覆蓋使用僞古典方法的方法也容易得多。請參閱https://stackoverflow.com/q/4508498/9897的說明。

+1

像鴨子一樣衝! - http://paulirish.com/2010/duck-punching-with-jquery/ –

0

有使用委託的原型,並採用僞古典繼承之間的重要區別。原型繼承依賴於爲委託設置原型,並且在Object.create()之前,唯一的方法是設置構造函數的prototype屬性。現在我們有了Object.create(),爲了同樣的目的,我使用它來代替構造函數。

使用委託原型的主要原因是通過共享相同的內存來保存委託給該原型的所有實例之間的函數。

您列出的示例稱爲工廠函數,它經常與Object.create()結合使用以實現方便的原型繼承。