Object.create 中的对象属性值是常量吗?

Are object properties value constants in Object.create?

这是一个很好奇的问题,我一直在学习一些东西 Javascript 并且我得到了可以工作的代码,但我想了解为什么会这样:

为什么在 Object.create 之外创建的 att 和 def boost 可以工作,但 属性 hp 是常量?

let Pokemon = {
  def: this.def,
  att: this.att,
  defBoost: function() {
    this.def = this.def + this.def
    return this.def;
  },
  attBoost: function() {
    this.att = this.att + this.att
    return this.att;
  },
  hpBoost: function() {
    this.hp = this.hp + this.hp
    return this.hp;
  }

}

let psyduck = Object.create(Pokemon, {
  name: {
    value: "Psyduck"
  },
  hp: {
    value: 500
  }
});

psyduck.def = 12;
psyduck.att = 20;

console.log(psyduck);

psyduck.attBoost();
psyduck.defBoost();
psyduck.hpBoost();

console.log(psyduck);

当您使用 descriptor 定义 属性 时,如 Object.definePropertiesObject.create,您未指定的所有属性默认为 false.所以当你有

hp: { value: 500}

表现得像

hp: {
    value: 500,
    enumerable: false,
    writable: false,
}

writable: false 表示 属性 是 read-only.

另一方面,当通过赋值创建 属性 时,enumerablewritable 都默认为 true

此外,请确保始终写入 strict mode,这样分配给 read-only 属性会引发错误,而不是静默失败!