下面的代码段是否有可能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
类添加属性,以便可以从任何创建的对象中获得这两个属性?
答案 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() {
方法。