在JavaScript中为哈希成员定义setter

在JavaScript中为哈希成员定义setter,javascript,setter,Javascript,Setter,我定义如下: var props = { id: null, title: null, status: null }; 我想为状态字段定义setter(并且仅为它定义setter),如下所示: props.__defineSetter__("status", function(val){ //Checking correctness of val... status = val; }); 但它不起作用:( 那么,正确的方法是什么呢?这应该可以: pro

我定义如下:

var props = {
    id: null,
    title: null,
    status: null
};
我想为状态字段定义setter(并且仅为它定义setter),如下所示:

props.__defineSetter__("status", function(val){
    //Checking correctness of val...
    status = val;
});
但它不起作用:( 那么,正确的方法是什么呢?

这应该可以:

props.__setStatus__ = function(val) {
    // Check correctness of val
    this.status = val;
}
用法:

props.__setStatus__('Alive');
这应该起作用:

props.__setStatus__ = function(val) {
    // Check correctness of val
    this.status = val;
}
用法:

props.__setStatus__('Alive');

很简单,你需要使用

this.status = val;
否则,您只是将一个不相关的全局变量
status
设置为
val

如前所述,setter/getter没有在IE中实现

另外,我不确定设置一个与其设置的属性同名的setter有多明智。我不确定这是否会导致冲突,但这似乎是个坏主意。是吗?理想情况下,要设置的变量应该隐藏在闭包中

var props = {
  id: null,
  title: null
};

(function() {

  var status;
  props.__defineSetter__("status", function(val){
    //Checking correctness of val...
    status = val;
  });

  props.__defineGetter__('status', function() { return status; });

}());

通过这种方式,
状态
可以完全避免直接访问,这就是使用setter和getter的要点。

简单,您需要使用

this.status = val;
否则,您只是将一个不相关的全局变量
status
设置为
val

如前所述,setter/getter没有在IE中实现

另外,我不确定设置一个与其设置的属性同名的setter有多明智。我不确定这是否会导致冲突,但这似乎是个坏主意。是吗?理想情况下,要设置的变量应该隐藏在闭包中

var props = {
  id: null,
  title: null
};

(function() {

  var status;
  props.__defineSetter__("status", function(val){
    //Checking correctness of val...
    status = val;
  });

  props.__defineGetter__('status', function() { return status; });

}());

通过这种方式,
status
可以完全避免直接访问,这就是使用setter和getter的要点。

首先是MooGoo指出的。但是,您不能使用与对象中现有变量相同的名称将属性setter分配给对象

因此,您的代码必须围绕以下内容:

var props = {
    id: null,
    title: null,
    hStatus: null,
};

props.__defineSetter__("status", function(v){
    this.hStatus = v;
});

props.__defineGetter__("status", function(){
    return this.hStatus;
});
[编辑]
是的,MooGoo给出的答案比我写这8的时间要快(.

第一件事是MooGoo指出的。但是,你不能使用与对象中现有变量相同的名称为对象分配属性设置器

因此,您的代码必须围绕以下内容:

var props = {
    id: null,
    title: null,
    hStatus: null,
};

props.__defineSetter__("status", function(v){
    this.hStatus = v;
});

props.__defineGetter__("status", function(){
    return this.hStatus;
});
[编辑]
是的,MooGoo Eddite的回答比我写这篇文章的时间要快(.

你知道目前只有Mozilla实现setter/getter吗?Chrome和Safari,可能还有Opera。IE和往常一样没有。你知道现在只有Mozilla实现setter/getter吗?Chrome和Safari,可能还有Opera。IE和往常一样没有。这些事情发生了,+1发生在你身上,+1发生在你身上