2016-04-29 18 views
0

我有一個設備父類,它需要args和兩個子武器和裝甲,它們也需要參數。我不知道是否有一種特殊的方式來定位原型,或者如果我的代碼實際上不工作,但這是一個shortened DEMO當兩個對象都傳遞參數時使用對象繼承

我需要創建變量用於每個對象的參數基於其他變量以及使用隨機數的算法。每個物品都是獨一無二的,所以我需要在武器傷害的同時使裝備的HP變得更好,我不知道該怎麼做。

function Equipment(hp) { 
    var self = this; 
    this.hp = hp; 
} 
//create subclass for weapons 
function Weapon(baseDam) { 
    var self = this; 
    this.baseDam = baseDam; 
} 

function generateEquipment() { 
    hp = Math.round(Math.random() * 10); 
    baseDam = Math.round(Math.random() * 50); 
    Weapon.prototype = new Equipment(hp); 
    weapon = new Weapon(baseDam); 
    stringed = JSON.stringify(weapon); 
    alert(stringed); 
} 

generateEquipment(); 
+0

請你多說一點關於你真正想要達到什麼樣的? – lipp

+0

我編輯了我的問題,希望澄清 – Shniper

+0

靠近:)我不明白爲什麼你返回一個「武器」,如果該方法被稱爲「generateEquipment」。您是否打算在此功能中創建其他「設備」? – lipp

回答

1

首先,回答你的問題: 你的代碼是不是真的錯了,和你的武器仍然有它的馬力,但其所含的對象原型,所以字符串化時將不會顯示。 有辦法解決這個問題,就像我已經顯示here一樣,但是根據我的說法,這並不是正確的方法。

通常情況下,原型應該只存儲方法而不是實例變量,因爲如果您以後決定修改原型,實例變量也會被修改,以防通過引用傳遞。

更好的模式是使用Object.assign - 它是最容易理解和感覺最自然的。此外,如果你期望武器是設備的一個子類,那麼這個邏輯應該封裝在Weapon本身。

下面是聲明你的武器級的提出了新的途徑:

function Weapon(baseDam) { 
    var self = this; 
    var hp = Math.round(Math.random() * 10); 
    Object.assign(self, Equipment.prototype, new Equipment(hp)); 
    this.baseDam = baseDam; 
} 

由於惠普還隨機產生的,這個邏輯現在封裝在武器。這也是可擴展的,因爲這種模式也適用於長繼承鏈。

有些人可能會推薦ES6類,這也是一種可行的方法,但在我看來,它是語法糖,它隱藏了代碼的大部分內部工作。

Here與我的方法是一個工作演示。

+0

這當然是一個工作的答案,我唯一的問題是,在我的實際代碼中,他們的設備有大約10個或更多的變量,我不想在函數Weapon和函數Armor中重複該代碼,所有需要通過localStorage,我不能通過localStorage函數 – Shniper

+0

你只需要採取所有的常用變量,並把它們放在父類......所有的武器具體和特定於盔甲的變量將進入它們各自的構造函數[見這裏](https://jsfiddle.net/v5kdygy5/)。至於localStorage,即時猜測你想要存儲實例而不是構造函數,所以'localStorage.weapon1 = new Weapon(12);'會工作得很好。 –

+0

如果我正確理解這一點,我只需要在武器和裝甲中創建變量而不是在generateEquipment函數中? – Shniper

0

您所描述的'圖案'被稱爲'構圖',並且可以非常強大。有很多不同的方法來組合/組成新的類或對象。

讀你的問題和意見,在我看來,你主要是感興趣的是定義許多不同類型的設備,沒有太多(重複)的代碼。

你有沒有想過要傳遞一個類名的數組到你的generateEquipment方法並返回一個新的自定義構造函數?這裏有一個例子:

function Equipment(hp) { 
 
    this.hp = Math.round(hp); 
 
} 
 

 
Equipment.prototype.describe = function() { 
 
    return "This piece of equipment has " + this.hp + " hitpoints"; 
 
} 
 

 
function Weapon(baseDam) { 
 
    this.baseDam = Math.round(baseDam); 
 
} 
 

 
Weapon.prototype.describe = function() { 
 
    return "The weapon does " + this.baseDam + " damage"; 
 
} 
 

 
function generateCustomEquipment(types) { 
 
    var CustomEquipment = function() { 
 
    var self = this; 
 

 
    // Create the properties for all types 
 
    types.forEach(function(type) { 
 
     type.call(self, Math.random() * 100); 
 
    }); 
 
    }; 
 

 
    CustomEquipment.prototype.describe = function() { 
 
    var self = this; 
 

 
    // Combine the 'describe' methods of all composed types 
 
    return types 
 
     .map(function(type) { 
 
     return type.prototype.describe.call(self); 
 
     }) 
 
     .join(". "); 
 
    } 
 

 
    return CustomEquipment; 
 
} 
 

 
var Sword = generateCustomEquipment([Equipment, Weapon]); 
 
var Armor = generateCustomEquipment([Equipment]); 
 
var Arrow = generateCustomEquipment([Weapon]); 
 

 
var sword1 = new Sword(); 
 
document.writeln("A sword: " + sword1.describe() + "<br/>"); 
 

 
var armor1 = new Armor(); 
 
document.writeln("A piece of armor: " + armor1.describe() + "<br/>"); 
 

 
var arrow1 = new Arrow(); 
 
document.writeln("An arrow: " + arrow1.describe() + "<br/>");