我可以在JavaScript对象上创建一个属性,每次引用它时都是新的吗?

在下面的代码中,输出将是相同的.

function dateObject() {
    this.date = new Date();
}

var wrapper = {
    dateObj: new dateObject()
};

console.log(wrapper.dateObj.date);

setTimeout(function () {
    console.log(wrapper.dateObj.date);
}, 3000);

我实际上偶然发现了这个检查,以确保财产的价值不会改变,但现在我很好奇.有没有办法让一个属性不是一个函数,而是一个函数的评估,每次都是新的?我问,因为你可以用其他语言来做(想想C#中的System.DateTime).

最佳答案
你可以使用Object.defineProperty.

这是一个例子:

function DateObject(time) {
    this._date = new Date(time);
}

Object.defineProperty(DateObject, "now", {
    get: function () {
        return new DateObject(Date.now());
    }
});

Object.defineProperty(DateObject.prototype, "time", {
    get: function () {
        return this._date.getTime();
    }
});

然后每次引用此属性时,它将等于get的函数求值结果:

// calls new DateObject(Date.now()), like Date.Now in C#
var d = DateObject.now;
// calls d._date.getTime()
d.time;                 

如您所见,现在是在DateObject上定义的.这就像一个静态属性.然后在对象的原型上定义时间,这意味着它将是DateObject实例的属性.

注意:研究Object.defineProperty的第三个参数的可枚举和可配置属性.它们很有用.

转载注明原文:我可以在JavaScript对象上创建一个属性,每次引用它时都是新的吗? - 代码日志