2016-01-28 45 views
7

所以我試圖圍繞不同的方式來創建一個對象。構造器模式和原型模式之間的區別

我來到創造對象的原型模式。

現在我在下面寫了兩個函數,但是我看不出兩者之間的功能差別是什麼?什麼時候使用構造函數模式,什麼時候使用Prototype模式?

構造模式

function Fruit(){} 
Fruit.color = "Yellow", 
Fruit.fruitName = "Banana", 
Fruit.nativeTo = "SomeValue" 

原型模式

function Fruit(){} 
Fruit.prototype.color = "Yellow", 
Fruit.prototype.fruitName = "Banana", 
Fruit.prototype.nativeTo = "SomeValue" 
+1

我覺得最大的區別之一是創建水果的新實例與它的所有方法和屬性的能力使用Prototype模式。在您的構造函數示例中:如果您嘗試爲像Fruit x = new Fruit()這樣的Fruit創建一個新對象,然後嘗試訪問像x.color這樣的屬性,那麼您將在Prototype中執行相同的操作時得到未定義的對象, 」。 – gothical

回答

12

可重用的組件......

構造

當您創建新的構造函數時,您將創建一切的新實例,重要的是對實例所做的任何更改只會影響它們,而不會影響其他實例。

原型

當您使用原型它會重複使用邏輯和原型鏈中的任何改變都會影響其他人的新對象。

這是一個很好的解釋:Javascript prototypes and instance creation

當使用每個模式是基於需求的 - 很含糊的答案,但從未在少的情況。

想想他們在整個JS中使用的對象,函數,數組,他們會在原型鏈上生活,因爲我們想要傳播的對他們的任何更改 - 附註:這就是爲什麼我們應該從不改變這些因爲它可以搞砸他們的行爲。

這裏

最好的解釋:JavaScript constructors, prototypes, and the new keyword

+1

感謝您花時間回答我的問題。你最後一個鏈接看起來很有前途生病肯定要看看它! –

+0

@MarcoGeertsma - 我的榮幸! –

1

變化原型的屬性將適用於所有的情況下,包括已經存在,那裏的財產,是由構造函數創建的改變只會改變它的實例

2

構造函數

基本上構造函數用於使用new運算符創建對象。

它用於初始化constructor.So的實例屬性,constrctor新的無非但面嚮對象語言,如C++類的實現,JAVA有。

每個構造函數都有屬性prototype,它們持有對構造函數的引用。

原型

的JavaScript缺乏基於類的繼承。我們使用Prototype來實現單層繼承。

因此,爲了在JavaScript中實現代碼可重用性,使用了原型。它只是原型繼承。

在原型添加原型繼承,方法或屬性可立即對象來自同一個構造函數創建

相關問題