在下面的代码中,输出将是相同的。
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
)。
答案 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
的第三个参数的configurable
和Object.defineProperty
属性。它们很有用。