Javascript Object.defineProperty允许我枚举原型属性,但Object.keys不';如果不包括那笔财产,你会得到什么?

Javascript Object.defineProperty允许我枚举原型属性,但Object.keys不';如果不包括那笔财产,你会得到什么?,javascript,Javascript,下面的代码段是否可以获取Object.keys以包含原型属性(例如健康) 注意:我需要在类的定义之后定义health属性。 职业玩家{ 建造师(级别){ 这个水平=水平; } } 常量玩家=新玩家(10); Object.defineProperty(Player.prototype,“health”{ 可枚举:正确, get:function(){ 返回此值。级别*15; } }); console.log(player.health); console.log(Object.keys(pl

下面的代码段是否可以获取
Object.keys
以包含原型属性(例如健康)

注意:我需要在类的定义之后定义health属性。

职业玩家{
建造师(级别){
这个水平=水平;
}
}
常量玩家=新玩家(10);
Object.defineProperty(Player.prototype,“health”{
可枚举:正确,
get:function(){
返回此值。级别*15;
}
});
console.log(player.health);
console.log(Object.keys(player));//不健康
对于(让道具进入玩家){
控制台日志(道具);

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

职业玩家{
建造师(级别){
这个水平=水平;
Object.defineProperty(这是“健康”{
可枚举:正确,
get:function(){
log('get函数内部');
返回此值。级别*15;
}
});
}
}
常量玩家=新玩家(10);
console.log(player.health);
console.log(Object.keys(player));
对于(让道具进入玩家){
控制台日志(道具);

}
我需要在类定义之外添加属性,这可能吗?您可以在创建实例后在实例上调用它,但这很奇怪。在这种情况下,它必须是一个实例?是否可以使该类不是该类的实例?我认为强制构造函数创建属性可能会像第一个示例中那样工作,方法是使用()=>{
calldefinedconstructor
然后
callobject.definedProperty
}覆盖已定义的构造函数。健康只是一个例子,实际上我定义的属性远比这更具动态性。您可以将类包装在一个函数中,该函数在调用时实例化一个对象,分配getter,并返回实例(如果需要)。没有办法避免必须在某个地方(在构造函数内部或在构造函数运行之后)分配给实例本身,因为
Object.key
只会直接迭代实例上的属性。(不过,如果需要,您可以迭代原型和实例)