如何在为对象成员分配值时执行功能?

时间:2015-01-16 14:14:14

标签: javascript

我有一个对象,约会,有一个成员,时间:

function appointment(date_string){
    this.time = ???;
}

当我从数据库中获取时间时,它有尾随零。我想在分配值之前删除它们。例如:

var a = new appointment("01/15/2015");
a.time = "01:33:00.000";
console.log(a.time) // should display 01:33:00, NOT 01:33:00.000

我试过

function appoinment(date_sting) {    
    this.time = function(){return (this.time).replace(".000","");};
}

但这在场景中不起作用。

2 个答案:

答案 0 :(得分:2)

ES 5.1 (ECMA 262)开始,您可以将set运算符与Object.defineProperty

一起使用
function appointment() {
    Object.defineProperty(this, 'time', {
        set: function (value) {
            value = value + '';
            this._time = value.replace(".000","");
        },
        get: function () {
            return this._time;
        }
    });
}

<强>更新

我提出了一个更好的版本,不会污染this&#39;范围:

function appointment() {
    var time;

    Object.defineProperty(this, 'time', {
        set: function (value) {
            value = value + '';
            time = value.replace(".000","");
        },
        get: function () {
            return time;
        }
    });
}

答案 1 :(得分:0)

正则表达式是你最好的朋友。 :)

a.time = "01:33:00.000".replace(/\.0+$/, "");

此外,“01:33:00.000”.replace(“。000”)没有做任何事情的原因可能是因为您忘记指定替换方法的第二个参数:替换为第一:

a.time = "01:33:00.000".replace(".000", "");

我建议使用正则表达式,因为它解决了具有不同数量的尾随零点的问题。 :)

编辑:好的,我看到你现在想要实现的目标;你想要一些在赋值时动态分析价值的东西。在这种情况下,您需要使用Object.defineProperty

var Appointment = function(timeString){
    var _time;

    Object.defineProperty(this, "time", {
        get:    function(){ return _time; },
        set:    function(i){
            _time = (i || "").replace(/\.0+$/, "");
        }
    });

    this.time = timeString;
};

console.log(new Appointment("20/08/2015").time);

但是,使用原生JavaScript对象上的Object.defineProperty 的公平警告不适用于Internet Explorer 8.因此,这种方法归结为您愿意支持的浏览器。

如果支持IE8(和/或更老版本)是一个问题,我建议使用旧式的get / set函数:

var Appointment = function(timeString){
    var _time;

    this.setTime    =   function(i){
        _time = (i || "").replace(/\.0+$/, "");
    };
    this.getTime    =   function(i){
        return _time;
    };
    this.setTime(timeString);
};

console.log(new Appointment("20/08/2015 1:33:00.000").getTime());