Javascript Object.defineProperty和返回值

Javascript Object.defineProperty和返回值,javascript,object,setter,getter,defineproperty,Javascript,Object,Setter,Getter,Defineproperty,我正在使用一个javascript对象,该对象使用object.defineProperty方法定义一些getter和setter function User() { var _username; var _id; Object.defineProperty(User, 'id', { get: function() { return _username; } });

我正在使用一个javascript对象,该对象使用object.defineProperty方法定义一些getter和setter

function User() {       
    var _username;  
    var _id;

    Object.defineProperty(User, 'id', {
        get: function() {
            return _username;
        }       
    });         

    Object.defineProperty(User, 'username', {
        get: function() {
            return _username;
        },
        set: function(username) {
            this._username = username;          
        }
    }); 
}
对于其中一个属性(id),我只需要一个getter。最初我有一个输入错误,它返回了
\u username
的值,但我很快意识到上面的方法不起作用。不过,出于好奇,我试图理解为什么它没有按预期工作。如果我做了以下事情:

var u = new User();
u.username = 'bob';
alert(u.username);
alert(u.id);

最后一条语句将提醒
undefined
,而不是
bob
。为什么呢?有没有办法让它返回另一个属性?

您必须在
这个
上定义属性,而不是构造函数

function User(params) {       
   var _username;

   Object.defineProperty(this, 'id', {
        get: function() {
            return _username;
        }       
   });         

   Object.defineProperty(this, 'username', {
        get: function() {
            return _username;
        },
        set: function(username) {
            _username = username;          
        }
   }); 
   if (params && params.username) {
       this.username = params.username;
   }
}
User.prototype.stringify = function () {
    return JSON.stringify({ username: this.username});
}

您是在
User
上定义属性,而不是在
u
上定义属性。请尝试
User.username
查看它是否正常工作,然后修复代码以不改变构造函数。将其更改为
this
似乎不起作用。如果我这样做,并在我的原始帖子中运行用户测试代码,第一个和第二个警报都会输出
未定义的
。这应该会起作用,你能告诉我你做了什么吗(举个例子)?如果你用
这个
替换
用户
,你已经做了一半:)我对你的代码做了更多的更改,我承认它们很微妙!请注意,您有
var\u用户名
这个。\u用户名
!!跟进问题。实现了上述解决方案后,为什么我不能这样做:
var u1=new User();u1.username='a';var u2=新用户();u2.username='b'username
上定义了一个getter/setter,它现在已经被剥离了。例如,如果您这样做:
x=新用户;x、 abc=1;JSON.stringify(x)stringify
函数(签出我的原始帖子)