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

时间:2019-07-23 01:32:09

标签: javascript prototype prototypal-inheritance prototype-chain

这是一个非常好奇的问题,我一直在学习一些Javascript,并且我的代码可以正常工作,但是我想了解为什么会发生这种情况:

为什么在Object.create之外创建att和def增强功能时它们可以工作,但是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);

1 个答案:

答案 0 :(得分:1)

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

hp: { value: 500}

就像

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

writable: false表示该属性为只读。

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

此外,请确保始终写入strict mode,以便将其分配给只读属性会引发错误,而不是无提示地失败!