如何循环访问由Object.defineProperty创建的对象属性

3
我可以帮您进行翻译。以下是您程序中的对象:

我在程序中有以下对象

function Player(id) {
    this.id = id;
    this.healthid = this.id + "health";
    this.displayText = "blah blah";
    this.inFight = false;
    this.currentLocation = 0;
    this.xp = 0;
    this.level = 1;
}

var player = new Player('player');

player.currentHealth = player.health;

然后我像这样打印属性名称:

function displayStats() {
    var statsHtml = "";
    for ( var prop in player ) {
        statsHtml += "<p id = 'displayPlayerHealth'>" + prop + "</p>";
    }

    $('.stats').html( statsHtml);
    console.log(statsHtml);
}

displayStats();

这个很好用,然而我声明的其他属性像这样

Object.defineProperty(player,"health",{ 
    set: function() { 
    return 10 + ( this.level * 15 );
    }, 
    get: function() { 
    return 10 + ( this.level * 15 );
    } 
} );


Object.defineProperty(player,"strength",{ 
    set: function() { 
        return ( this.level * 5 );
    }, 
    get: function() { 
        return ( this.level * 5 );
    } 
} );

Object.defineProperty(player,"hitRating",{ 
    set: function() { 
        return 3 + ( this.level );
    }, 
    get: function() { 
        return 3 + ( this.level );
    } 
} );

请勿在此处输出代码

现在我加入了这段代码以确保它们被定义。

console.log(player.hitRating);

这样就给了我4,正是我所期望的。

那么如何遍历使用Object.defineProperty创建的对象属性呢?

同时也欢迎对我的代码进行其他评论和帮助。

1个回答

8

只需要将它们设置为 enumerable: true

Object.defineProperty(player,"hitRating",{ 
    set: function() { 
        return 3 + ( this.level );
    }, 
    get: function() { 
        return 3 + ( this.level );
    },
    enumerable: true 
} );

fiddle

引自MDN

可枚举属性(enumerable)
如果该属性可以出现在对应对象的属性枚举中,则为 true,否则为 false。 默认值为 false


如何使成员(函数、this变量等)不可枚举,而不是通过Object.defineProperty定义?有什么方法可以做到这一点吗? - toddmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接