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

时间:2015-04-10 20:51:48

标签: 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)。

1 个答案:

答案 0 :(得分:8)

您可以使用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;                 

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

注意:研究enumerable的第三个参数的configurableObject.defineProperty属性。它们很有用。