0

我正在尝试为日期对象定义一个新的 getter。但是它返回false。我的错误在哪里?

Date.prototype.__defineGetter__('ago', function(){
    var diff = ((( new Date()).getTime() - this.getTime()) / 1000)
    , day_diff = Math.floor(diff / 86400);
    return day_diff == 0 && (
    diff < 60 && "just now" ||
    diff < 120 && "1 minute ago" ||
    diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
    diff < 7200 && "1 hour ago" ||
    diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
    day_diff == 1 && "Yesterday" ||
    day_diff < 7 && day_diff + " days ago" ||
    day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago";
});

var a = new Date('12/12/1990');
console.log(a.ago);
4

1 回答 1

5

您在一个多月前没有进行测试,所以它只是返回false,这是您||操作的最后一个值。

[...]
day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago" ||
'More than a month ago';
[...]

var a = new Date('12/12/1990');
console.log(a.ago()); //More than a month ago

小提琴

此外,__defineGetter__它是非标准的且已弃用,因此我已将其替换为小提琴中的标准原型方法属性。这是原始吸气剂的小提琴

编辑: ES5 提供了一个标准的Object.defineProperty方法,在下面的评论中查看@bfavaretto 和@Bergi 的版本:

Object.defineProperty(Date.prototype, "ago", {
    get: function() {
        [...]
    }
});

原型方法似乎略快defineProperty,但考虑到在最新稳定的 Chrome V8 中结果从 60 到 2.3 亿次/秒不等的误差范围,没有明显的性能差异。属性查找非常快,因此即使在 Node 环境中也不应该有任何显着差异。

于 2013-01-24T19:32:33.767 回答