使用setter / getter获取/更新值

时间:2015-10-12 14:42:58

标签: javascript

我有一个方法path的对象。当没有参数执行方法时,我希望它像getter一样,当使用参数时 - 就像一个setter。我怎么能用js getters / setters做到这一点?这个选项似乎错了:

var o = {
  get path(p) {
     if (p === undefined) {
        return _path;
     } else {
        return _path=p;
     }
  }
}

如果我定义这样的对象:

var o = {
  get path() {
    return _path;
  }
  set path() {
    _path=p;
  }
}

然后将其设置为o.path("some"),浏览器(Chrome)执行getter然后抛出o.path is not a function

2 个答案:

答案 0 :(得分:3)

Getters和setter不会那样工作。当您只是访问该属性时,getter将跟进某个函数逻辑。没有必要调用一个函数,同样的事情是你不必调用函数的setter,你在尝试设置属性时也会这样做。

所以getter和setter是一个很好的写作方式:

o.getProp();
o.setProp(nValue);

要:

o.prop;
o.prop = nValue;

不要将setter逻辑与getter逻辑混合:



var __path = '/';
var o = {}
Object.defineProperty(o, 'path', {
    get: function(){
     return __path;   
    },
    set: function(p){
        __path = p;
    }
});

console.log(o.path, __path);
o.path = '/home';
console.log(o.path, __path);




我在这个例子中使用了Object.defineProperty,但这似乎也有效:

var o = {
    get path(){
        return __path;
    },
    set path(n){
        __path = n;
    }
}

答案 1 :(得分:1)

这样的事情:

if (dateFromEpochTime > dateToEpochTime) {
    date = dateFrom.data("kendoDateTimePicker").value();
    date.setHours(23);
    date.setMinutes(59);
    date.setSeconds(59);

    dateTo.kendoDateTimePicker({
        value: date,
        format: "dd-MM-yyyy HH:mm:ss"
    })
    changedByCode = true;
}
} else {
    if (dateFromEpochTime > dateToEpochTime) {
        date = dateTo.data("kendoDateTimePicker").value();
        date.setHours(00);
        date.setMinutes(00);
        date.setSeconds(00);

        dateFrom.kendoDateTimePicker({
            value: date,
            format: "dd-MM-yyyy HH:mm:ss"
        })
        changedByCode = true;
    }
}