Das ist eine wirklich gute Frage!
Die Antwort von TJ Crowder hat eine ausgezeichnete Lösung, aber ich habe darüber nachgedacht: Was können wir noch tun? Wie können wir das umgehen Date.prototype.setTime.call(yourFrozenDate)
?
1. Versuch: "Wrapper"
Eine direkte Möglichkeit besteht darin, eine AndrewDate
Funktion bereitzustellen , die ein Datum umschließt. Es hat alles, was ein Datum hat, abzüglich der Setter:
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);
Dadurch wird ein Objekt erstellt, das alle Eigenschaften eines tatsächlichen Datumsobjekts aufweist und Function.prototype.bind
zum Festlegen seiner Objekte verwendet this
.
Dies ist keine narrensichere Art, sich um die Schlüssel zu versammeln, aber hoffentlich können Sie meine Absicht sehen.
Aber warte ... wenn wir es hier und da etwas weiter betrachten, können wir sehen, dass es einen besseren Weg gibt, dies zu tun.
function SuperAndrewDate(realDate) {
return new Proxy(realDate, {
get(target, prop) {
if (!prop.startsWith('set')) {
return Reflect.get(target, prop);
}
}
});
}
var proxyDate = SuperAndrewDate(new Date());
Und wir haben es gelöst!
... irgendwie. Siehe, Firefox ist derzeit die einzige, die Proxys implementiert, und aus bizarren Gründen können Datumsobjekte nicht als Proxys verwendet werden. Außerdem werden Sie feststellen, dass Sie immer noch Dinge wie tun können, 'setDate' in proxyDate
und Sie werden Vervollständigungen in der Konsole sehen. Um dies zu überwinden, müssen mehr Fallen bereitgestellt werden. Insbesondere has
, enumerate
, ownKeys
,getOwnPropertyDescriptor
und wer weiß , was seltsam Rand Fällen gibt es!
... Beim zweiten Gedanken ist diese Antwort fast sinnlos. Aber zumindest hatten wir Spaß, oder?
Object.freeze()
das gesamte Objekt auf. Es scheint zu funktionieren, bis auf dieses kleine Date-Problem.