我有一个设备父类,它接受参数,两个子类武器和盔甲也接受参数。我不确定是否有一种特殊的方法来定位原型(prototype),或者我的代码是否实际上不起作用,但这里有一个 shortened DEMO
我需要根据其他变量的值以及使用随机数的算法创建用于每个对象中的参数的变量。每个元素都是独一无二的,所以我需要在增加武器伤害的同时增加装备的生命值,但我不知道该怎么做。
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();
最佳答案
首先回答你的问题: 你的代码并没有真正错误,你的武器仍然有它的马力,除了它包含在对象原型(prototype)中,所以在字符串化时不会显示。 有很多方法可以解决这个问题,就像我已经展示的 here ,但据我所知,这不是正确的方法。
通常,原型(prototype)应该只存储方法而不是实例变量,因为如果您稍后决定修改原型(prototype),则实例变量也会被修改,以防它是通过引用传递的。
更好的模式是使用 Object.assign - 它是最容易理解并且感觉最自然的。此外,如果您希望 Weapon 是设备的子类,则该逻辑应该封装在 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;
}
由于 HP 也是随机生成的,因此该逻辑现在封装在 Weapon 中。这也是可扩展的,因为这种模式也适用于长继承链。
有些人可能会推荐 ES6 类,这也是一种可行的方法,但在我看来,它是语法糖,它隐藏了代码的大部分内部工作原理。
Here是我的方法的一个有效演示。
关于javascript - 当两个对象都传递参数时使用对象继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36939299/