Object.defineProperty让我枚举原型属性,但是Object.keys不包含该属性,这有什么用?

时间:2019-01-10 02:27:54

标签: javascript

下面的代码段是否有可能Object.keys包含原型属性(例如 health )?

注意:我需要在类定义之后定义健康属性。

class Player {
  constructor(level) {
    this.level = level;
  }
}

const player = new Player(10);

Object.defineProperty(Player.prototype, "health", {
  enumerable: true,
  get: function() {
    return this.level * 15;
  }
});

console.log(player.health);

console.log(Object.keys(player)); // not showing health

for (let prop in player) {
  console.log(prop);
}

如果没有,我该如何向具有运行状况属性的Player类添加属性,以便可以从任何创建的对象中获得这两个属性?

1 个答案:

答案 0 :(得分:2)

Object.keys只会返回直接在实例上 的键数组。原型上的所有键都将被忽略。尽管您可以使用for..in循环在原型链上的任何位置获取所有可枚举的键,但是最好在构造函数的 instance 上调用defineProperty分配getter属性:

class Player {
  constructor(level) {
    this.level = level;
    Object.defineProperty(this, "health", {
      enumerable: true,
      get: function() {
        console.log('Inside the get function');
        return this.level * 15;
      }
    });
  }
}

const player = new Player(10);


console.log(player.health);
console.log(Object.keys(player));

for (let prop in player) {
  console.log(prop);
}

如果必须在类外使用defineProperty,请在创建实例后在实例上调用它:

class Player {
  constructor(level) {
    this.level = level;
  }
}

const player = new Player(10);
Object.defineProperty(player, "health", {
  enumerable: true,
  get: function() {
    console.log('Inside the get function');
    return player.level * 15;
  }
});

console.log(player.health);
console.log(Object.keys(player));

for (let prop in player) {
  console.log(prop);
}

尽管如此,这确实是一件很奇怪的事情,特别是对于听起来好像不是动态的属性,例如health。我更喜欢使用普通的get health() {方法。