C'est une très bonne question!
T. J. Crowder, en réponse a une excellente solution, mais ça m'a fait penser: Que pouvons-nous faire? Comment pouvons-nous aller autour de la Date.prototype.setTime.call(yourFrozenDate)
?
1ère tentative: "Wrapper"
D'une façon directe, est de donner un AndrewDate
fonction qui encapsule une date. Elle a tout d'une date a moins le setters:
function AndrewDate(realDate) {
var proto = Date.prototype;
var propNames = Object.getOwnPropertyNames(proto)
.filter(propName => !propName.startsWith('set'));
return propNames.reduce((ret, propName) => {
ret[propName] = proto[propName].bind(realDate);
return ret;
}, {});
}
var date = AndrewDate(new Date());
date.setMonth(2); // TypeError: d.setMonth is not a function
Ce que ce n'est de créer un objet qui a toutes les propriétés d'une date réelle de l'objet a et utilise Function.prototype.bind
pour définir leur this
.
Ce n'est pas un imbécile preuve façon de rassembler autour de ces clés, mais j'espère que vous pouvez voir mon intention.
Mais attendez...y regarder d'un peu plus ici et là, nous pouvons voir qu'il y a une meilleure manière de faire ceci.
function SuperAndrewDate(realDate) {
return new Proxy(realDate, {
get(target, prop) {
if (!prop.startsWith('set')) {
return Reflect.get(target, prop);
}
}
});
}
var proxyDate = SuperAndrewDate(new Date());
Et nous l'avons résolu!
...en quelque sorte. Voir, Firefox est le seul droit qui met en œuvre des procurations, et pour certains bizarre raisons de la date d'objets ne peuvent pas être mandaté. En outre, vous remarquerez que vous pouvez toujours faire des choses comme 'setDate' in proxyDate
et vous verrez le nombre de diplômés en console. Pour surmonter que plus de pièges doivent être fournis; plus précisément, has
, enumerate
, ownKeys
, getOwnPropertyDescriptor
et qui sait quelle étrange bord des cas, il y en a!
...Donc, à la réflexion, cette réponse est presque inutile. Mais au moins nous avons eu le plaisir, droit?