【问题标题】:Javascript OOP Constructor with array or sub-object?带有数组或子对象的Javascript OOP构造函数?
【发布时间】:2015-04-27 16:51:48
【问题描述】:

我是真正的 OOP 的新手,但我对 javascript 的理解还不错。我正在尝试使用构造函数模式创建新对象,但我想将其中一个属性设为数组。

这是我正在尝试做的一个示例:

function Walker(name, type, ws, bs, s, armor, i, a, hp) {
    this.name = name;
    this.type = type;
    this.ws = ws;
    this.bs = bs;
    this.s = s;
    this.armor = new Array("f", "s", "r");
    this.i = i;
    this.a = a;
    this.hp = hp;
}

这是为你们中的一些人可能知道的游戏(并且仅供个人使用,因为创建该游戏的公司已经为他们的 IP 贴出了他们的...)

如您所见,armor 属性内部将包含 3 个属性。我这样做的原因是因为已经有一个名为s的属性,所以我不希望该属性和s的盔甲属性混淆。

我正在制作一个新的walker 并尝试像下面这样记录盔甲:

var specificWalker = new Walker("Specific Walker", "Vehicle", 5, 5, 6, [12, 12, 10], 4, 2, 3);

console.log(specificWalker.armor[0]);

不过,这当然行不通,因为armor[0] 总是等于“f”,我不知道如何覆盖数组的那部分。

理想情况下,我想做的是能够以这种方式记录盔甲:

console.log(specificWalker.armor.f) //Should log "12"

但我不确定如何在对象内部制作对象。

有人可以帮忙吗?

【问题讨论】:

标签: javascript arrays object


【解决方案1】:

你只需要创建一个对象,而不是一个数组,像这样

this.armor = ["f", "s", "r"].reduce(function(result, current, index) {
    result[current] = armor[index];
    return result;
}, {});

现在,this.armor 不是数组,而是对象。当你打印specificWalker.armor时,你会得到这样的东西

{ f: 12, s: 12, r: 10 }

然后你就可以访问f,如你所愿

console.log(specificWalker.armor.f);
// 12

【讨论】:

  • 非常简单。像魅力一样工作!我将不得不研究.reduce 函数。我从来没有遇到过。 @AmitJoki,这实际上正是我在粗体文本中所要求的。我只需要输入specificWalker.armor.f 即可将其注销。谢谢!
  • @ntgCleaner 请查看Array.prototype.reduce的官方文档,以获得解释和示例:)
【解决方案2】:

我认为你在构造函数上有这么多参数,我会这样做:

function Walker(prop) {
    this.name = prop.name;
    this.type = prop.type;
    this.ws = prop.ws;
    this.bs = prop.bs;
    this.s = prop.s;
    this.armor = prop.armor;
    this.i = prop.i;
    this.a = prop.a;
    this.hp = prop.hp;
}

这样称呼它

var walker = new Walker({
    name : "",
    type : "",
    ws : "",
    bs : "",
    s : "",
    armor : [12,12,39],
    i : "",
    a : "",
    hp : ""
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2017-04-27
    • 1970-01-01
    • 2018-05-09
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多