2017-03-09 119 views
1

我正在用Javascript填充數據庫字段的域對象。假設我有兩個對象dogcat和我有以下構造函數的定義:Javascript繼承模式

function Dog(opt_data) { 
    var data = opt_data || {}; 

    this.createdAt = data['created_at']; 
    this.updatedAt = data['updated_at']; 
    this.name = data['name']; 
    this.breed = data['breed']; 
} 


function Cat(opt_data) { 
    var data = opt_data || {}; 

    this.createdAt = data['created_at']; 
    this.updatedAt = data['updated_at']; 
    this.name = data['name']; 
    this.fur = data['fur']; 
} 

現在,上述兩種對象都craetedAtupdatedAt性能。那麼,我應該創建一個新的類BaseModel哪些有屬性,並讓所有的對象繼承,或者在這種模式的JavaScript有更好的選擇?

更新1:

我從評論和答案的理解。

function Cat(opt_data) { 
    var data = opt_data || {}; 


    this.name = data['name']; 
    this.fur = data['fur']; 

    this.updateTimestamp(data); 
} 
Cat.prototype = Object.create({ 
    updateTimestamp: function(data) { 
    this.createdAt = data['created_at'] || new Date(); 
    this.updatedAt = data['updated_at'] || new Date(); 
    } 
}); 
+1

'上述兩個對象的craetedAt和updatedAt屬性'不在您發佈的代碼中。 –

+0

除非您發現您需要其他東西,否則請進行簡單的鴨子打字。 – Bergi

+0

@Bergi你能給我舉個例子嗎? – CodeYogi

回答

1

除非createdAtupdatedAt值有你需要定義兩個DogCat對象的一些常用方法支持或訪問器,只需設置屬性的任何值,你需要他們。因爲你沒有在JavaScript中聲明對象成員(你在C++,C#,Java等中的方式),所以在你提出的情況下,從BaseModel原型繼承沒有什麼可以獲得的。也就是說,由於您不必在JavaScript中執行任何操作來創建createdAtupdatedAt屬性,而不是簡單地指定給它們,所以基本類型實際上並不提供任何有用的內容,因爲您只需將這些屬性分配給無論如何,基類型構造函數。

如果兩個對象需要類似的方法來保存和加載數據(可能在保存時自動更新updatedAt屬性),那麼您可能需要基本類型。在這種情況下,同時提供DogCat保存和加載方法的原型將是原型繼承模式的有用應用程序。

+0

如果有更多具有相同屬性的對象會怎麼樣?難道你不認爲我們會編寫重複的代碼嗎? – vivek

+0

@vivek對於在現有對象上設置屬性的輔助函數,這將是一種情況。原型繼承模型對此特定情況沒有任何用處。 – cdhowie

+0

@cdhowie坦率地說,我仍然無法圍繞這一點,也許我無法擺脫經典的繼承模式。 – CodeYogi