在javascript对象的特定属性上启用可枚举

在javascript对象的特定属性上启用可枚举,javascript,oop,prototype,Javascript,Oop,Prototype,我仍然在学习javascript OOP和原型设计。在什么时候以及如何使用可枚举文件方面遇到了麻烦,并且一直在搜索文档,但仍然没有什么好运气。我有以下代码,当我打电话时: users.hasOwnProperty('addUser'); // retruns true, I want it to be false. function Chat(u) { this.username = u; this.inbox = []; } var users = { addUser:

我仍然在学习javascript OOP和原型设计。在什么时候以及如何使用可枚举文件方面遇到了麻烦,并且一直在搜索文档,但仍然没有什么好运气。我有以下代码,当我打电话时:

users.hasOwnProperty('addUser'); // retruns true, I want it to be false.

function Chat(u) {
   this.username = u;
   this.inbox = [];
}
var users = {
    addUser: function(ins) {
        this[ins.username] = ins;
    }
};
users.addUser(new Chat('id1000'));
这可能吗?如果是这样的话,这是一种好的做法吗? 干杯

到目前为止我所做的:使用Object.defineProperty

Object.defineProperty(users, 'addUser', { // this says Uncaught TypeError
   set function(ins) {
       this[ins.username] = ins;
}
});
var users = {};

在您有一个名为addUser的用户之前,它可以正常工作。您不应该混合使用数据和方法,如果要将对象用作键/值存储,请仅将其用于该目的。@meagar如果将其放入对象用户的原型中,是否可以调用users.addUser?与users.prototype.addUser=function..类似,您可以使用创建不可枚举的属性。另见。因此,是的,这在ES5兼容主机中是可能的。这是否是一个好主意取决于设计的其余部分、实现相同结果的选项以及好的标准。我建议您在聊天对象的实例数据中添加一个对象,并将名称存储在该对象中,这样用户名和方法名称之间就不会有冲突。这可能比使用Object.defineProperty试图隐藏某些名称更好,因为即使您已从枚举中隐藏它们,它们仍会与用户名冲突。@AnthonyLloveras如果可以,也无所谓。正在设置此['addUser']=。。。会对物体原型中的任何东西产生阴影。